我正在研究一种通用方法,该方法将对从CollectionBase派生的自定义集合进行操作。泛型方法将比我的示例代码中显示的更多,但这代表了我的问题的本质。
当我尝试以下操作时,我得到编译器错误“此时类型参数名称无效”,并且CreateInstance()调用中指示了参数T:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(T) as T;
}
相反,我必须使用typeof(T)并将其传递给CreateInstance:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
var targetType = typeof (T);
return Activator.CreateInstance(targetType) as T;
}
没什么大不了的,但有没有另一种方法可以声明我的GetInstance方法,这样我可以直接将T传递给Activator.CreateInstance(),就像在第一个examaple中一样?在这种情况下,我是否使用了通用类型“T”?
我想我的问题的本质是我假设T是一个实际的类型。但编译错误和需要调用typeof(T)似乎表明它是一个类型的名称。
答案 0 :(得分:6)
是的,Activator.CreateInstance
有一个接受泛型类型参数的重载:
return Activator.CreateInstance<T>();
答案 1 :(得分:2)
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(typeof(T)) as T;
}
或:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance<T>();
}
答案 2 :(得分:0)
T
是一种类型,而不是System.Type
个实例。
就像你需要写CreateInstance(typeof(Exception))
而不是CreateInstance(Exception)
一样,你也需要写CreateInstance(typeof(T))
而不是CreateInstance(T)
答案 3 :(得分:0)
或
public CollectionBase GetInstance<T>() where T : CollectionBase, new()
{
return new T();
}
答案 4 :(得分:0)
假设您有一个名为MyClass的类。
如果你想使用Activator.CreateInstance,你仍然需要这样做 Activator.CreateInstance(typeof运算(MyClass的))
这是因为MyClass实际上引用了MyClass的静态版本(你称之为静态方法)。
而是typeof(MyClass)返回类System.Type。
的实例修改强>
我知道没有真正的静态版本。这只是一个显示MyClass和typeof(MyClass)之间差异的构造。虽然我并没有完全错。如果您有两个应用程序共享包含MyClass的类库,则MyClass具有静态成员 公共类MyClass
{
private static int myStaticMember = 0;
}
然后,由于.NET的沙盒,这两个应用程序具有单独的静态版本的MyClass,并且不共享该成员。实际上,他们每个人都有一个“MyClass的静态实例”......就像看起来那样矛盾:)。