我可以将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); }