我想使用泛型创建任何类的实例。 这可能吗?
我尝试了这个但是没有用:
public class blabla
{
public void bla();
}
public class Foo<T>
{
Dictionary<string, Func<object>> factory;
public Foo() => factory = new Dictionary<string, Func<object>>();
public WrapMe(string key) => factory.Add(key, () => new T());
}
...
var foo = new Foo<blabla>();
foo.Wrapme("myBlabla");
var instance = foo.factory["myBlabla"];
instance.Bla();
答案 0 :(得分:4)
有两种方法可以解决这个问题:
变式1 :将where T : new()
添加到您的班级定义中:
public class Foo<T> where T : new()
{
...
}
有关详细信息,请参阅the new() constraint。
的说明 变体2 :将lambda () => new T()
作为参数传递给构造函数,将其存储在Func<T>
字段中并在WrapMe
中使用。
有关详细信息,请参阅this blog post
答案 1 :(得分:2)
你只需要一个方法:
private static T InstantiateInstance<T>() where T : new() => new T();
答案 2 :(得分:2)
您可以使用Activator.CreateInstance<T>()
。
答案 3 :(得分:1)
答案 4 :(得分:0)
在声明Foo时需要使用新约束。这仅适用于具有不带参数的构造函数的类型 - 在您的情况下这很好。