Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在Activator.CreateInstance中直接使用泛型方法类型_C# - Fatal编程技术网

C# 无法在Activator.CreateInstance中直接使用泛型方法类型

C# 无法在Activator.CreateInstance中直接使用泛型方法类型,c#,C#,我正在研究一个通用方法,该方法将对从CollectionBase派生的自定义集合进行操作。泛型方法将比我的示例代码中显示的做得更多,但这代表了我问题的本质 当我尝试以下操作时,我得到一个编译器错误类型参数名称此时无效,参数T在CreateInstance调用中指示: public CollectionBase GetInstance<T>() where T : CollectionBase { return Activator.CreateInstance(

我正在研究一个通用方法,该方法将对从CollectionBase派生的自定义集合进行操作。泛型方法将比我的示例代码中显示的做得更多,但这代表了我问题的本质

当我尝试以下操作时,我得到一个编译器错误类型参数名称此时无效,参数T在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;
}