接口对象的调用方法

时间:2019-01-20 22:34:31

标签: c# system.reflection

我有以下界面:

public interface IPropertyEditor
{
    string GetHTML();
    string GetCSS();
    string GetJavaScript();
}

我想获取所有从IPropertyEditor继承的类并调用方法并获取返回值。

我一直在尝试,以下是我通过精修所做的最好的事情。

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方法认为该类型是一个类并尝试创建一个实例,但是由于该类型是一个接口而失败了。

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

过滤器将包含界面。确保过滤的类型是类而不是抽象的,以确保可以初始化。

-

同样基于所使用的激活器,还假设被激活的类具有默认构造函数。

答案 1 :(得分:1)

您需要从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));