MethodInfo的总是空当从实例
歌厅类型有人能解释我为什么在这里我得到了正确的MethodInfo
: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
作为基类的类;
其实我无法找到它为什么会返回null的原因,因为我正在使用第二种方法,并且我正在调试并确保_vo.Phase
字符串具有正确的方法名称,因此我尝试了第一种方法,结果如此。
而且调试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;
}
的this
关键字是多余的。你可以在内部使用GetType(),它会引用你的类。
_vo.Phase
必须是正确的情况下,你不需要BindingFlags.Instance。我将删除BindingFlags.NonPublic,并将方法访问修饰符更改为public,以查看GetMethod()是否可以真正找到它。
您始终可以使用GetMethods()来枚举类中的可用方法。甚至可能使用linq查询来获取所需的MethodInfo对象。
'typeof(T)'和'T.GetType()**必须是**相同的类型。你有没有检查过你的情况? – dymanoid
@dymanoid这将是调试它的好方法,但我没有为信息而感谢。 –