通过通用方式创建任何C#类的intance
我想使用generics创建任何类的实例。 那可能吗?
我试过这个但是没有用:
public class blabla { public void bla(); } public class Foo { Dictionary<string, Func> factory; public Foo() => factory = new Dictionary<string, Func>(); public WrapMe(string key) => factory.Add(key, () => new T()); } ... var foo = new Foo(); foo.Wrapme("myBlabla"); var instance = foo.factory["myBlabla"]; instance.Bla();
你只需要一个方法:
private static T InstantiateInstance() where T : new() => new T();
有两种方法可以解决这个问题:
变体1 : where T : new()
类定义中添加where T : new()
:
public class Foo where T : new() { ... }
有关更多详细信息,请参阅new()约束的说明 。
变体2 :将lambda () => new T()
作为参数传递给构造函数,将其存储在Func
字段中并在WrapMe
使用它。
有关详细信息,请参阅此博客文章
您可以使用Activator.CreateInstance
。
使用Inversion of Control容器 ,如Castle Windsor 。
在声明Foo时需要使用新约束。 这仅适用于具有不带参数的构造函数的类型 – 在您的情况下这很好。