2010-03-22 10 views

Répondre

16

MethodBase est utilisé comme une classe de base de MethodInfo qui possède une propriété ReturnType.

Vous pouvez essayer de convertir vers une instance de MethodInfo et vérifier cette propriété.

+0

si nous voulons trouver de MemberInfo. Supposons ce scénario que nous voulons filtrer tous les membres, comme les méthodes et les champs qui sont/retournent le type de chaîne. Est-ce que MemberInfo a une propriété pour l'indiquer? –

21

MethodBase lui-même n'a pas de type de retour car, en plus des méthodes normales, il est également utilisé pour représenter des méthodes, telles que les constructeurs, qui n'ont pas de type de retour. Au lieu de cela, vous devez voir s'il s'agit d'une instance de MethodInfo et vérifier cela pour la propriété ReturnType.

CompileTimeValidate(MethodBase method) { 
    var normalMethod = method as MethodInfo; 
    if(normalMethod != null) { 
    ValidateReturnType(normalMethod.ReturnType); 
    } 
} 
1

Essayez quelque chose comme ceci. MethodInfo a la propriété mais MethodBase est également utilisé pour les constructeurs, et ils n'ont pas de type de retour.

MethodBase b = this.GetType().GetMethods().First(); 
if(b is MethodInfo) 
    MessageBox.Show((b as MethodInfo).ReturnType.Name); 
+2

Point mineur ... si vous vérifiez déjà 'b est MethodInfo', alors un cast direct' (MethodInfo) b' est légèrement préférable à 'b comme MethodInfo'. –

+0

Comment ça se fait? :) ... –

+2

La ligne directrice I: Utiliser 'as' lors de la réception d'une valeur nulle (pour un type incompatible) est acceptable pour votre code. Dans ce cas, comme une valeur null n'est * pas * acceptable à l'intérieur du if, utilisez '(MethodInfo) b' à la place. Mieux encore, évitez le coût de faire deux fois le cast en utilisant 'as' au lieu de' is' et en testant null. – Bevan