有人可以解释一下,为什么我得到正确的MethodInfo

MethodInfo mi = typeof(ContextTimerMode).GetMethod(_vo.Phase, BindingFlags.Instance | BindingFlags.NonPublic);

if (mi != null)
{
    mi.Invoke(this, new object[] { btns, vo });
}


尝试直接从实例获取它时总是返回null ?:

MethodInfo mi = (this as ContextTimerMode).GetType().GetMethod(_vo.Phase, BindingFlags.Instance | BindingFlags.NonPublic);

// mi always null
if (mi != null)
{
    mi.Invoke(this, new object[] { btns, vo });
}


上面的代码来自ContextTimerMode

this是一个以ContextTimerMode为基类的类;

实际上,当我使用第二种方法并且正在调试并确保_vo.Phase字符串具有正确的方法名称时,我有时找不到它返回null的原因,因此我尝试了第一种方法并解决了。

同样在调试this时显示this不是ContextTimerMode实例而是具有ContextTimerMode基的类型-这就是为什么我尝试使用(this as ContextTimerMode).GetType()的原因...

最佳答案

那是因为即使您这样做:

(this as ContextTimerMode).GetType()


结果类型将不是ContextTimerMode,而是从ContextTimerMode继承的类型(因此,this的实际类型,与您执行this.GetType()相同)。 GetType()始终返回实际类型,即使您在声明为某种基本类型的变量上使用它也是如此。您正在尝试获取该类型的私有实例方法。您的继承类型确实不包含此方法,因此GetMethod正确返回null。

如果要解决此问题,可以手动遍历层次结构,如下所示:

static MethodInfo GetMethod(Type type, string methodName, BindingFlags flags) {
    var mi = type.GetMethod(methodName, flags);
    if (mi != null)
        return mi;
    if (type.BaseType != null)
        return GetMethod(type.BaseType, methodName, flags);
    return null;
}

10-05 21:48