无法在Activator.CreateInstance </t>中直接使用泛型方法类型<t>

时间:2011-03-02 18:41:53

标签: c#

我正在研究一种通用方法,该方法将对从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)似乎表明它是一个类型的名称。

5 个答案:

答案 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的静态实例”......就像看起来那样矛盾:)。