C# 无法在Activator.CreateInstance中直接使用泛型方法类型
我正在研究一个通用方法,该方法将对从CollectionBase派生的自定义集合进行操作。泛型方法将比我的示例代码中显示的做得更多,但这代表了我问题的本质 当我尝试以下操作时,我得到一个编译器错误类型参数名称此时无效,参数T在CreateInstance调用中指示:C# 无法在Activator.CreateInstance中直接使用泛型方法类型,c#,C#,我正在研究一个通用方法,该方法将对从CollectionBase派生的自定义集合进行操作。泛型方法将比我的示例代码中显示的做得更多,但这代表了我问题的本质 当我尝试以下操作时,我得到一个编译器错误类型参数名称此时无效,参数T在CreateInstance调用中指示: public CollectionBase GetInstance<T>() where T : CollectionBase { return Activator.CreateInstance(
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(T) as T;
}
相反,我必须使用typeofT并将其传递给CreateInstance:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
var targetType = typeof (T);
return Activator.CreateInstance(targetType) as T;
}
没什么大不了的,但是有没有另一种方法来声明我的GetInstance方法,这样我就可以像在第一个example中那样直接将T传递给Activator.CreateInstance?在这种情况下,我对泛型T的使用被接受了吗
我想我问题的实质是我假设T是一个实际类型。但是编译器错误和需要调用typeofT似乎表明它是一个类型的名称。是的,有一个接受泛型类型参数的重载:
return Activator.CreateInstance<T>();
是,具有接受泛型类型参数的重载:
return Activator.CreateInstance<T>();
或:
或:
T是一个类型,而不是System.type实例
正如您需要编写CreateInstancetypeofException而不是CreateInstanceException一样,您也需要编写CreateInstanceTypeSoft而不是CreateInstanceT,T是一个类型,而不是一个System.type实例
就像您需要编写CreateInstancetypeofException而不是CreateInstanceException一样,您也需要编写CreateInstanceTypeSoft而不是CreateInstanceT
或
假设您有一个名为MyClass的类 如果您想使用Activator.CreateInstance,您仍然需要执行以下操作 Activator.CreateInstanceTypeOfCyclass 这是因为MyClass实际上引用了MyClass的静态版本,您可以在该版本上调用它的静态方法 相反,typeofMyClass返回类System.Type的实例 编辑 我知道没有真正的静态版本。这只是一个显示MyClass和typeofMyClass之间差异的构造。虽然我没有完全错。如果您有两个应用程序共享包含MyClass的类库,并且MyClass有一个静态成员 公共类MyClass
{
private static int myStaticMember = 0;
}
然后,由于.NET的沙箱化,这两个应用程序有单独的MyClass静态版本,并且不共享该成员。实际上,它们都有一个MyClass的静态实例。。。这看起来很矛盾:。假设您有一个名为MyClass的类 如果您想使用Activator.CreateInstance,您仍然需要执行以下操作 Activator.CreateInstanceTypeOfCyclass 这是因为MyClass实际上引用了MyClass的静态版本,您可以在该版本上调用它的静态方法 相反,typeofMyClass返回类System.Type的实例 编辑 我知道没有真正的静态版本。这只是一个显示MyClass和typeofMyClass之间差异的构造。虽然我没有完全错。如果您有两个应用程序共享包含MyClass的类库,并且MyClass有一个静态成员 公共类MyClass
{
private static int myStaticMember = 0;
}
然后,由于.NET的沙箱化,这两个应用程序有单独的MyClass静态版本,并且不共享该成员。实际上,它们都有一个MyClass的静态实例。。。尽管这看起来很矛盾:。请记住,T不是运行时信息或值。这是编译时信息。因此,您不能将其作为方法参数传递。谢谢,Humberto。这就清楚了。谢谢大家的快速回答!所有这些都是有帮助的。请记住,T不是运行时信息或值。这是编译时信息。因此,您不能将其作为方法参数传递。谢谢,Humberto。这就清楚了。谢谢大家的快速回答!都很有帮助。啊!我怎么会错过这个!谢谢,这正是我想要的。太好了,很乐意帮忙!由于不需要,我将铸件移到了T啊!我怎么会错过这个!谢谢,这正是我想要的。太好了,很乐意帮忙!由于不需要,我将铸件移到了T你的术语有误导性。MyClass没有静态版本;这只是一个类型文字。你的术语有误导性。MyClass没有静态版本;它只是一个类型文本。
{
private static int myStaticMember = 0;
}