接口对象的调用方法
Call Method of interface object
我有以下界面:
public interface IPropertyEditor
{
string GetHTML();
string GetCSS();
string GetJavaScript();
}
我想获取所有继承自 IPropertyEditor 的 classes 并调用方法并获取 return 值。
我一直在努力,我通过搜索所做的最好的如下。
var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
foreach (var item in types)
{
string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}
问题是它抛出以下异常:
MissingMethodException: Constructor on type 'MyAdmin.Interfaces.IPropertyEditor' not found.
我认为 CreateInstance 方法认为类型是 class 并尝试创建一个实例,但失败了,因为类型是接口。
我该如何解决这个问题?
过滤器将包含界面。确保过滤后的类型是 class 而不是抽象类型,以确保它可以被初始化。
.Where(p =>
p.IsClass &&
!p.IsAbstract &&
type.IsAssignableFrom(p));
同样基于使用的激活器假设被激活的 classes 有一个默认构造函数。
您需要将 IPropertyEditor
(本身)从 types
中豁免
var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => p.IsClass && !p.IsAbstract && type.IsAssignableFrom(p));
foreach (var item in types)
{
string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}
如果确定没有抽象方法,也可以使用
.Where(p => p != type && type.IsAssignableFrom(p));
我有以下界面:
public interface IPropertyEditor
{
string GetHTML();
string GetCSS();
string GetJavaScript();
}
我想获取所有继承自 IPropertyEditor 的 classes 并调用方法并获取 return 值。
我一直在努力,我通过搜索所做的最好的如下。
var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
foreach (var item in types)
{
string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}
问题是它抛出以下异常:
MissingMethodException: Constructor on type 'MyAdmin.Interfaces.IPropertyEditor' not found.
我认为 CreateInstance 方法认为类型是 class 并尝试创建一个实例,但失败了,因为类型是接口。
我该如何解决这个问题?
过滤器将包含界面。确保过滤后的类型是 class 而不是抽象类型,以确保它可以被初始化。
.Where(p =>
p.IsClass &&
!p.IsAbstract &&
type.IsAssignableFrom(p));
同样基于使用的激活器假设被激活的 classes 有一个默认构造函数。
您需要将 IPropertyEditor
(本身)从 types
var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => p.IsClass && !p.IsAbstract && type.IsAssignableFrom(p));
foreach (var item in types)
{
string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}
如果确定没有抽象方法,也可以使用
.Where(p => p != type && type.IsAssignableFrom(p));