C#对泛型实例化对像的方法

最近在搞一个小东东,用到了泛型的处理,用到了对泛型的实例化问题。下面来讲讲对泛型的实例化,以代码为例,如:

public class A
{

}

public class B<T>
{
  public static T Get()
     {

         //在这一块如何实例化T这个对象呢?如果用default(T)这个是不行的。只能做一个null值处理。

      }

}

  

以上的方法就是遇到最麻烦的问题。一直以来都以为default(T)就可以实例化T这个对像,其实不然,这个只能起一个null值的作用。如果要解决以上的问题现在有两种方法:

一、在使用泛型的类后面加入一个 where T : new(),代码如下:

public class A
{
  
}

public class B<T> where T : new()
{
  public static T Get()
     {
         T result = new T();//这样就可以实例化。也可以编译通过。

         ...........
      }

}

  

对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的。事实上,使用new关键字的作用只是让编译器在泛型实例化之处,检查所绑定的泛型参数是否具有无参构造函数,也可以实例化出来一个对象。

二、可以使用System.Activator.CreateInstance<T>()创建泛型实例对像。代码如下:

public class A
{
  
}

public class B<T>
{
  public static T Get()
     {
        T s = System.Activator.CreateInstance<T>();

         .....

      }

}

  

上面所讲的两种方式都是以用反射机制来获取泛型对象的实例的。

时间: 2024-10-31 10:39:35

C#对泛型实例化对像的方法的相关文章

使用泛型对读写配置文件的方法进行封装

一般一个站点会有多个配置文件,如果要针对每个配置文件进行读写,这是要疯的节奏 之前学泛型,一直没用到过,在这里练习一下,体会泛型实际对我们减少冗余代码的作用 /// <summary> /// 站点配置文件的路径 /// </summary> public class ConfigPath { /// <summary> /// 数据库配置文件 /// </summary> public static readonly string DB = "/

C++类的实例化的两种方法

C++ 类的实例化有两种方法: 直接定义对象: 先定义一个类: class A { public: A(); virtual ~A(); ... ... }; 类实现略. 用的时候: A a; a. 成员函数: a. 成员变量: a 就是一个对象. 定义一个类指针的方法: A *p = new A; p->成员函数: p->成员变量: 最后别忘了销毁对象:delete[] a;  A由系统创建并释放,你不要担心会出现内存泄露,但是生命期只有在本区域的大括号内,出了大括号就没用了.p是指针,要自

android 使用泛型再也不写findViewById方法了

我们在开发中肯定会findViewById寻找view,如果一个界面上有很多view需要绑定click事件,那么findViewById就是个体力活了,那我们就想能不能有一种办法能不能不必要每次去findViewById呢?只要你去想,说明你就意识到这个问题,剩下来就是想办法如何解决了,这个问题也不能,如果熟悉javase中的泛型,就会很简单的解决,代码入下 public <T> T $(int viewID) { return (T)findViewById(viewID); } 我们只要在

Gson通过借助TypeToken获取泛型参数的类型的方法(转)

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. class Foo<T>

泛型集合的静态扩展方法

C# 中的泛型集合提供了很多基于 Enumerable 的静态扩展方法,例如  Find,  OrderBy , Average ,Distinct 等,在使用基础数据类型的集合时,可以直接调用这些方法,但如果是自定义类型就应当根据扩展方法所要求的接口,实现自定类型的扩展接口类,其实质就是使用扩展类的实例方法完成特定的操作逻辑,否则对集合的操作将是无效的.本文以 OrderBy 为例进行说明 . 首先需要一个自定义的类 ,这是一个表示自然人属性的简单类,列出了姓名.年龄和性别(这里使用了枚举类型

Gson通过借助TypeToken获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. class Foo<T>

java反射1--产生Class类的实例化对象三个方法

首先每一个类在实例化的时候都会产生一个.class文件.而Class对象既是将.class文件读入内存时,为它创建一个Class对象. 反射就是对Class对象进行操作. 1 package reflect.vo; 2 3 /** 4 * @author guohao 5 * java测试类Student 6 */ 7 public class Student { 8 private String name; 9 private int age; 10 private float score;

ArrayList类(泛型)的Remove和RemoveAt方法

1.Remove方法 功能:删除与指定值相同的第一个元素 格式:object.Insert(指定的值) 效果: 数组{0.2.3.4.5.4} 删除第一次出现4的元素 2.RemoveAt方法 功能:删除指定索引值的那个元素. 格式:object.Insert(索引值) 效果: 数组{0.2.3.4.5.4} Remove at 某个位置, Remove 某个东西删除具体的值 RemoveAt 是删除索引处的元素 Remove是删除跟参数一样的东西

实例化的两种方法(new和函数法)

// 定义类 类名字是 classA  function classA(){      this.b=1;  }  classA.prototype.b=44;  classA.prototype.show = function(){      alert(this.b);  };  // 用new实例化  var b = new classA();  b.show();  //11没有this.b=1的话输出为44(现在构造函数里面找没找到再到原型上面找)// 用函数实例化  function