使用重载的构造函数实例化泛型类型

时间:2012-02-03 11:16:40

标签: c# oop

class MyClass<T> where T: new()
{
    public Test()
    {
        var t = new T();
        var t = new T("blah"); // <- How to do this?
    }
}

我知道写作是不可能的,据我所知,它只是不被允许(虽然我只想对此感到错误)。想到的第一个解决方案是使用对象初始值设定项,但我们假设这是最后的手段,因为在这种情况下它会与其他oop目标冲突。

我的下一个倾向是使用反射,但在我这样做之前,我想知道我是否忽略了更简单的方法来做到这一点,或者可能是一个更好的设计模式?

2 个答案:

答案 0 :(得分:4)

你不能直接这样做。你需要使用Activator.CreateInstance,但这样做有反射的所有缺点,这意味着你错过了编译时检查等。

public Test()
{
    var t = (T)Activator.CreateInstance(typeof(T), (object)"blah");
}

答案 1 :(得分:3)

您可以强制用户为您提供从string构建对象的方法,如下所示:

internal class MyClass<T>
    where T : new()
{
    public void Test(Func<string, T> func)
    {
        var t = func("blah");
    }
}

Function可以是contruction MyClass对象的一部分,因此每次调用必须创建T的方法时都不必传递它。实际上,可能不需要new()这个方法。