12

我有以下类树:

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
{

}

给定SomeOtherClass parameter = new SomeOtherClass())这有效:

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

但是这个:

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

抛出一个NullReferenceException,而我希望它会调用与上面完全相同的方法。

我尝试了几个绑定标志无济于事。有什么帮助吗?

4

2 回答 2

24

您应该使用带参数的重载BindingFlags之一,并包含FlattenHierarchy.

指定应返回层次结构上的公共和受保护静态成员。不返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性。不返回嵌套类型。

(编辑删除了关于私有静态方法的观点,现在问题已更改为将它们公开。)

于 2012-09-11T00:02:42.517 回答
6

您需要将BindingFlags.FlattenHierarchy标志传递给以GetMethod向上搜索层次结构:

typeof(C).GetMethod("GetMe", BindingFlags.FlattenHierarchy, null, new Type[] { typeof(SomeOtherClass) }, null)).Invoke(null, parameter));
于 2012-09-11T00:02:52.703 回答