How to get MethodInfo of interface method, having implementing MethodInfo of class method?
Asked Answered
J

3

34

I have a MethodInfo of an interface method and Type of a class that implements the interface. I want to find the 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?

Jibber answered 11/7, 2009 at 12:38 Comment(0)
J
45

OK, I found a way, using 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];
Jibber answered 11/7, 2009 at 13:13 Comment(1)
index return -1 when dealing with a generic method.Expedition
A
2

Here's an extension method!

public static MethodInfo GetImplementedMethod(this Type targetType, MethodInfo interfaceMethod)
{
    if (targetType is null) throw new ArgumentNullException(nameof(targetType));
    if (interfaceMethod is null) throw new ArgumentNullException(nameof(interfaceMethod));

    var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType);
    var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod);
    if (index < 0) return null;

    return map.TargetMethods[index];
    
}
Asymptomatic answered 16/10, 2021 at 4:2 Comment(0)
E
0

I use this.

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

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

return map.TargetType.GetMethod(interfaceMethodInfo.Name, interfacemethodParameterTypes);
Expedition answered 24/2, 2021 at 17:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.