检查MethodInfo实例是接口通用方法

时间:2017-12-10 16:48:16

标签: c# .net reflection

我有界面

public interface ITest
{
    Task<bool> MyMethod1<T>(string key, out T value);
    Task<bool> MyMethod2<T>(string key, out T value);
}

他们实施

public class TestImpl : ITest
{
    public Task<bool> MyMethod1<T>(string key, out T value) // Implements interface
    {
        // Skipped
    }

    public Task<bool> MyMethod1<T>(string key, T value) // Does not implements interface
    {
        // Skipped
    }

    public Task<bool> MyMethod2<T>(string key, out T value) // Implements interface
    {
        // Skipped
    }

    public Task<bool> MyMethod2<T>(string key, T value) // Does not implements interface
    {
        // Skipped
    }
}

我需要检查MethodInfo的指定实例是ITest接口的方法实现。

例如:

void DoWork(MethodInfo methodInfo)
{
    if (...) // Check methodInfo is implementation of any method declared in ITest interface
    {
        /* Do something */
    }
}

怎么做?

2 个答案:

答案 0 :(得分:1)

我有一个想法,但我不知道它是否适合你的情况 为什么你没有得到实现的类型the class,然后你得到你感兴趣的接口名称nameof(ITest),然后你遍历这个接口的所有方法,由类似如下:

foreach(var methodInfo in typeof(TestImpl).GetInterface(nameof(ITest)).GetMethods())
{

}

这是一个非常简单的想法,事实上你没有在foreach循环中对接口名称进行硬编码,这也很好。 如果它不适合您的情况,请考虑在您的问题中添加更多详细信息,以便我可以考虑不同的想法并编辑此答案,或者有人可以帮助您。 的修改
或者您可以通过属性ReflectedType获取具体的类类型,然后您可以获得反射映射&#39;使用GetInterfaceMap方法基于特定接口类型的此类方法,此方法将返回在此具体类类型中为此接口类型实现的方法,然后您可以简单地使用方法{{1}根据您的要求检查特定的Contains实例。希望这对你有帮助。

MethodInfo

答案 1 :(得分:0)

您可以使用GetInterfaceMap:

var testImpl = new TestImpl();
        var interfaceTargeMethods = testImpl.GetType().GetInterfaceMap(typeof(ITest)).TargetMethods;

        foreach (var methodInfo in testImpl.GetType().GetMethods())
        {
            if (interfaceTargeMethods.Contains(methodInfo))
            {
                // do something...
            }    
        }