views:

704

answers:

2

I have a MethodInto of interface method and type of a class that implements the interface. I want to find MethodInfo of the class method that implements the interface method.

The simple method.GetBaseDefinition() does not work with interface methods. Lookup by name won't work either, because when implementing interface method explicitly it can have any name (yes, not in C#).

So what is the correct way of doing that that covers all the possibilities?

A: 

Hmmm - not sure about the correct way, but you can do it by looping through all the interfaces on your type, and then searching the interfaces for the method. Not sure if you can do it directly without the looping through the interfaces, as you're kinda stuck without GetBaseDefinition().

For my interface with a single method (MyMethod) and my type (MyClass) which implements this method I can use this:

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;
        }
    }
}

You'd have to check that the MethodInfo.Equals works if the two methods have different names. I didn't even know that was possible, probably cos I'm a C#'er

Rob Levine
You can't match by name. Names don't have to match. It's a C# rule, other languages (VB) let you name overriding methods whatever you like.
Krzysztof Koźmic
My sample above is not matching by name, it is matching by the Equals method on the MethodInfo. I was just meaning that you would need to double check that MethodInfo.Equals still considers two instances equal if they vary only by name.
Rob Levine
Right, sorry, but your code is still not doing what I need. It won't give me class' method info - it will give me interface' method info. You merely assert that the class implements the interface.
Krzysztof Koźmic
+5  A: 

OK, I found a way.

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

if (index == -1)
{
    //something's wrong;
}

return map.TargetMethods[index];
Krzysztof Koźmic