我有一个例子:
Assembly asm = Assembly.Load("ClassLibrary1");
Type ob = asm.GetType("ClassLibrary1.UserControl1");
UserControl uc = (UserControl)Activator.CreateInstance(ob);
grd.Children.Add(uc);
还有我创建一个类的实例,但我怎么可以创建一个实现了一些接口的类的实例? 即实现的UserControl1接口I负荷 。
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 I负荷inteface
你可以使用结果对象作为ILoad
ILoad uc = (ILoad)Activator.CreateInstance(ob);
grd.Children.Add(uc);
此外,你不需要通过接口来对待它,如果你写
UserControl1 uc = (UserControl1)Activator.CreateInstance(ob);
grd.Children.Add(uc);
的成员ILoad
将是可调用作为uc.SomeILoadMethod();
你想要什么可以使用像`NInject”一个IoC容器来实现。 您可以配置一个容器返回一个具体类型,当你所要求的接口。
接口是一个接口。 这是一个模板。 你为什么要实例化的界面? 实现接口和实例化类。 你不能实例化一个接口,它并没有真正意义。
与接受的答案唯一的问题是,你必须对你的组件实现该接口的具体类。
为了避免这种情况我已经创建了我的CustomActivator就是能够在运行时创建一个动态物体,并使其实现所需的接口。
我把它放在github上: https://github.com/fabriciorissetto/CustomActivator
电话是简单的:
CustomActivator.CreateInstance<MyInterface>();
如果库项目中所引用您可以使用:
static public IEnumerable<Type> GetTypesFromLibrary<T>(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<T>(String library, String FullClassName)
{
Type Type = GetTypesFromLibrary<T>(library)
.Where(t => t.FullName.Equals(FullClassName))
.FirstOrDefault();
if (Type != null)
{
T Instance = (T)Activator.CreateInstance(Type);
return Instance;
}
return default(T);
}