MethodInfo的总是空当从实例

问题描述:

歌厅类型有人能解释我为什么在这里我得到了正确的MethodInfoMethodInfo的总是空当从实例

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()试过......

+0

'typeof(T)'和'T.GetType()**必须是**相同的类型。你有没有检查过你的情况? – dymanoid

+0

@dymanoid这将是调试它的好方法,但我没有为信息而感谢。 –

这是因为,即使你这样做:

(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对象。