如何获取接口方法的MethodInfo,实现类方法的MethodInfo?

时间:2009-07-11 12:38:22

标签: c# .net reflection methodinfo

我有MethodInfo 接口方法和Type,它实现了接口。 我想找到实现接口方法的类方法的MethodInfo

简单method.GetBaseDefinition()不适用于接口方法。 按名称查找也不起作用,因为当显式实现接口方法时,它可以有任何名称(是的,不是在C#中)。

那么正确这样做的方式涵盖了所有可能性?

3 个答案:

答案 0 :(得分:35)

好的,我找到了一种方法,使用GetInterfaceMap

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType);
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod);

if (index == -1)
{
    //this should literally be impossible
}

return map.TargetMethods[index];

答案 1 :(得分:1)

嗯 - 不确定正确的方式,但你可以通过循环遍历你的类型的所有接口,然后在接口上搜索方法来实现。不知道你是否可以在不通过接口循环的情况下直接完成它,因为你没有GetBaseDefinition()就好了。

对于我使用单个方法(MyMethod)和我实现此方法的类型(MyClass)的接口,我可以使用它:

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod");
MethodInfo classMethodInfo = null;
Type[] interfaces = typeof(MyClass).GetInterfaces();

foreach (Type iface in interfaces)
{
    MethodInfo[] methods = iface.GetMethods();

    foreach (MethodInfo method in methods)
    {
        if (method.Equals(interfaceMethodInfo))
        {
            classMethodInfo = method;
            break;
        }
    }
}

如果两个方法具有不同的名称,则必须检查MethodInfo.Equals是否有效。我甚至不知道那是可能的,可能因为我是一个C#'呃

答案 2 :(得分:0)

我用这个。

var interfacemethodParameterTypes = interfaceMethodInfo.GetParameters().Select(p => p.ParameterType).ToArray();

var map = targetType.GetInterfaceMap(interfaceMethodInfo.DeclaringType);

return map.TargetType.GetMethod(interfaceMethodInfo.Name, interfacemethodParameterTypes);