C# GetMethod doesn't return a parent method
Asked Answered
L

2

14

I have the following class tree:

public class A
{
    public static object GetMe(SomeOtherClass something)
    {
        return something.Foo();
    }
}

public class B:A
{
    public static new object GetMe(SomeOtherClass something)
    {
        return something.Bar();
    }
}

public class C:B
{

}

public class SomeOtherClass
{

}

Given SomeOtherClass parameter = new SomeOtherClass()) this works:

typeof(B).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter));

But this:

typeof(C).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter));

throws a NullReferenceException, while I wish it would call the exact same method than above.

I've tried several binding flags to no avail. Any help?

Letterhead answered 10/9, 2012 at 23:58 Comment(0)
F
29

You should use one the overloads taking a BindingFlags parameter, and include FlattenHierarchy.

Specifies that public and protected static members up the hierarchy should be returned. Private static members in inherited classes are not returned. Static members include fields, methods, events, and properties. Nested types are not returned.

(Edited to remove the point about private static methods, now the question has been changed to make them public.)

Fluoro answered 11/9, 2012 at 0:2 Comment(7)
The methods are public static, I misstyped the question (and I thought I had proof read it D:). Thanks still!Sundries
@SebastiánVansteenkiste: In that case, just changing the binding flags to include FlattenHierarchy (and static, and public) should be fine.Fluoro
Many thanks! For the future generations then: typeof(C).GetMethod("GetMe", BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(SomeOtherClass) }, null)).Invoke(null, parameter)); did the trick.Sundries
What if you don't want the parent methods? Parent methods are being returned for me even without specifying FlattenHierarchy. The derived class is abstact, btwAsia
@DevDave: That surprises me - it sounds like it's probably best to ask about that in a separate question, with a short but complete program demonstrating the problem.Fluoro
I found that specifying BindingFlags.DeclaredOnly solved this for me. Not sure why it was returning derived methods by default. I was using a Controller Class that derived from an abstract Controller Class.Asia
@Asia using BindingFlags.DeclaredOnly (in conjunction with BindingFlags.Instance and BindingFlags.Public) did the trick for me as well when I was getting inherited methods from Object (like ToString, Equals, GetType, and GetHashCode) when calling GetMethods on my reflected type.Blindworm
C
6

You need to pass BindingFlags.FlattenHierarchy flag to GetMethod in order to search up the hierarchy:

typeof(C).GetMethod("GetMe", BindingFlags.FlattenHierarchy, null, new Type[] { typeof(SomeOtherClass) }, null)).Invoke(null, parameter));
Claudication answered 11/9, 2012 at 0:2 Comment(2)
I seem to have missed FlattenHierarchy.. Thanks, I'll try that right now!Sundries
Adding not only FlattenHierarchy but also Public and Static solved it.Sundries

© 2022 - 2024 — McMap. All rights reserved.