有人可以解释一下,为什么我得到正确的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;
}