我可以将Activator.CreateInstance与接口一起使用吗?

我有一个例子:

Assembly asm = Assembly.Load("ClassLibrary1"); Type ob = asm.GetType("ClassLibrary1.UserControl1"); UserControl uc = (UserControl)Activator.CreateInstance(ob); grd.Children.Add(uc); 

我正在创建一个类的实例,但是如何创建实现某个接口的类的实例? 即UserControl1实现ILoad接口。

U:我可以稍后将对象转换为接口,但我不知道程序集中的哪个类型实现了接口。

这是我曾经使用过几次的代码。 它在程序集中查找实现某个接口的所有类型:

 Type[] iLoadTypes = (from t in Assembly.Load("ClassLibrary1").GetExportedTypes() where !t.IsInterface && !t.IsAbstract where typeof(ILoad).IsAssignableFrom(t) select t).ToArray(); 

然后,您在ClassLibrary1中拥有实现ILoad所有类型。

然后,您可以实例化所有这些:

 ILoad[] instantiatedTypes = iLoadTypes.Select(t => (ILoad)Activator.CreateInstance(t)).ToArray(); 

您无法创建接口的实例,但是如果

UserControl1实现ILoad接口

您可以将结果对象用作ILoad

 ILoad uc = (ILoad)Activator.CreateInstance(ob); grd.Children.Add(uc); 

而且,如果你写的话,你不需要通过接口来处理它

 UserControl1 uc = (UserControl1)Activator.CreateInstance(ob); grd.Children.Add(uc); 

uc.SomeILoadMethod();成员可以被调用为uc.SomeILoadMethod();

你想要的是使用像’NInject’这样的IoC容器。 您可以配置容器以在请求接口时返回具体类型。

接口是一个接口。 这是一个模板。 你为什么要实例化一个接口? 实现接口并实例化该类。 你不能实例化一个接口,它真的没有意义。

接受答案的唯一问题是您必须在程序集上具有实现接口的具体类。

为了避免这种情况,我创建了我的CustomActivator,它能够在运行时创建动态对象并使其实现所需的接口。

我把它放在github上: https : //github.com/fabriciorissetto/CustomActivator

电话很简单:

 CustomActivator.CreateInstance(); 

如果项目中引用了库,您可以使用:

  static public IEnumerable GetTypesFromLibrary(String library) { var MyAsemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(a=>a.GetName().Name.Equals(library)) .Select(a=>a); var Exported = MyAsemblies .FirstOrDefault() .GetExportedTypes(); var Asignable = Exported .Where (t=> !t.IsInterface && !t.IsAbstract && typeof(T).IsAssignableFrom(t)) .Select(t=>t) .AsEnumerable(); return Asignable; } static public T GetInstanceOf(String library, String FullClassName) { Type Type = GetTypesFromLibrary(library) .Where(t => t.FullName.Equals(FullClassName)) .FirstOrDefault(); if (Type != null) { T Instance = (T)Activator.CreateInstance(Type); return Instance; } return default(T); }