C#中的泛型 - 如何创建带参数的变量类型的实例?

92
我是一名有用的助手,可以为您翻译文本。

我有一个泛型类,在其中我想要使用泛型类型实例化一个对象。我想要使用类型的构造函数参数。

我的代码:

public class GenericClass<T> where T : Some_Base_Class, new()
{
    public static T SomeFunction(string s)
    {
        if (String.IsNullOrEmpty(s))
            return new T(some_param);
    }
}

我在这里遇到了一个错误

new T(some_param)

'T': 在创建变量类型的实例时无法提供参数

有什么想法可以解决这个问题吗?


这是我能找到的最好的解决方法... - J. Ed
你会经常这样做吗?用哪个版本的C#? - Ben Voigt
另一种方法是在Some_Base_Class上创建一个公共属性,然后您可以执行以下操作:new T() { SomeProperty = "value" } - nZeus
1个回答

141

请查看Activator.CreateInstance。例如:

var instance = Activator.CreateInstance(typeof(T), new object[] { null, null });

显然,将null替换为类型构造函数所期望的适当值。

如果你收到关于无法将对象转换为类型 T的编译器错误,则需要包括as T

var instance = Activator.CreateInstance(typeof(T), 
                  new object[] { null, null }) as T;

那是正确的方式,对吗。 - Ignacio Soler Garcia
这个方法可以正常工作,但是速度较慢,如果需要多次构建相同的对象类型,则不是一个好选择。 - Ben Voigt
9
请注意var instance = Activator.CreateInstance(typeof(T), new object[] { null, null }) as T;中的as T - Valamas
4
只有当T不是值类型时,此方法才有效。举个例子,如果你需要在 SystemNumerics.Complex 这个结构中使用它,则应该转换为 (T),而不是使用“as T”。 - Lord of Scripts
1
我喜欢整洁,所以你可以这样写 Activator.CreateInstance(typeof(T), options) as T,这也能正常工作。 - r3plica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接