通过通用方式创建任何C#类的实例

时间:2009-12-16 11:04:33

标签: c# generics

我想使用泛型创建任何类的实例。 这可能吗?

我尝试了这个但是没有用:

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();

5 个答案:

答案 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时需要使用新约束。这仅适用于具有不带参数的构造函数的类型 - 在您的情况下这很好。