class MyClass<T> where T: new()
{
public Test()
{
var t = new T();
var t = new T("blah"); // <- How to do this?
}
}
我知道写作是不可能的,据我所知,它只是不被允许(虽然我只想对此感到错误)。想到的第一个解决方案是使用对象初始值设定项,但我们假设这是最后的手段,因为在这种情况下它会与其他oop目标冲突。
我的下一个倾向是使用反射,但在我这样做之前,我想知道我是否忽略了更简单的方法来做到这一点,或者可能是一个更好的设计模式?
答案 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()
这个方法。