Arm*_*ots 13 .net c# reflection activator .net-assembly
我有一个例子:
Assembly asm = Assembly.Load("ClassLibrary1");
Type ob = asm.GetType("ClassLibrary1.UserControl1");
UserControl uc = (UserControl)Activator.CreateInstance(ob);
grd.Children.Add(uc);
Run Code Online (Sandbox Code Playgroud)
我正在创建一个类的实例,但是如何创建实现某个接口的类的实例?即UserControl1实现ILoad接口.
U:我可以稍后将对象转换为接口,但我不知道程序集中的哪个类型实现了接口.
Bot*_*000 19
这是我曾经使用过几次的代码.它在程序集中查找实现某个接口的所有类型:
Type[] iLoadTypes = (from t in Assembly.Load("ClassLibrary1").GetExportedTypes()
where !t.IsInterface && !t.IsAbstract
where typeof(ILoad).IsAssignableFrom(t)
select t).ToArray();
Run Code Online (Sandbox Code Playgroud)
然后你有ClassLibrary1中的所有类型实现ILoad.
然后,您可以实例化所有这些:
ILoad[] instantiatedTypes =
iLoadTypes.Select(t => (ILoad)Activator.CreateInstance(t)).ToArray();
Run Code Online (Sandbox Code Playgroud)
接受的答案的唯一问题是您的程序集中必须有一个实现接口的具体类。
为了避免这种情况,我创建了我的 CustomActivator,它能够在运行时创建动态对象并使其实现所需的接口。
我放在github上:https : //github.com/fabriciorissetto/CustomActivator
调用很简单:
CustomActivator.CreateInstance<MyInterface>();
Run Code Online (Sandbox Code Playgroud)
您不能创建接口的实例,但是如果
UserControl1 实现 ILoad 接口
您可以将结果对象用作 ILoad
ILoad uc = (ILoad)Activator.CreateInstance(ob);
grd.Children.Add(uc);
Run Code Online (Sandbox Code Playgroud)
而且,你不需要通过接口来对待它,如果你写
UserControl1 uc = (UserControl1)Activator.CreateInstance(ob);
grd.Children.Add(uc);
Run Code Online (Sandbox Code Playgroud)
的成员ILoad可以调用为uc.SomeILoadMethod();
| 归档时间: |
|
| 查看次数: |
18067 次 |
| 最近记录: |