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

本文关键字:实例化 泛型类型 构造函数 重载 | 更新日期: 2023-09-27 18:22:17

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

我知道这不可能像书面那样,据我所知,这是根本不允许的(尽管我只想在这一点上犯错(。 想到的第一个解决方案是使用对象初始值设定项,但假设这是最后的手段,因为在这种情况下它会与其他 oop 目标冲突。

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

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

你不能

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

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

你可以强制用户给你从string构造对象的方法,像这样:

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

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