2010-03-22 5 views

Antwort

16

Method wird als Basisklasse von MethodInfo verwendet, die ReturnType eine Eigenschaft hat.

Sie können versuchen, eine Instanz von MethodInfo zu generieren und diese Eigenschaft zu überprüfen.

+0

Was passiert, wenn wir es von Member finden möchten. Nehmen Sie dieses Szenario an, in dem alle Elemente gefiltert werden sollen, z. B. Methoden und Felder, die/den Zeichenfolgetyp zurückgeben. Hat MemberInfo eine Eigenschaft, die das anzeigt? –

21

MethodBase selbst hat keinen Rückgabetyp, da es zusätzlich zu normalen Methoden auch Methoden wie Konstruktoren darstellt, die keinen Rückgabetyp haben. Stattdessen müssen Sie sehen, ob es sich um eine Instanz von MethodInfo handelt, und überprüfen Sie dies für die ReturnType Eigenschaft.

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

Versuchen Sie etwas wie das. MethodInfo hat die Eigenschaft, aber MethodBase wird auch für Konstruktoren verwendet, und sie haben keinen Rückgabetyp.

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

Kleiner Punkt ... Wenn Sie bereits 'b MethodInfo' überprüfen, ist ein direkter Cast' (MethodInfo) b' etwas besser als 'b wie MethodInfo'. –

+0

Wie kommt es? :) ... –

+2

Die Richtlinie, der ich folge: Verwenden Sie "wie", wenn Sie eine Null (für einen inkompatiblen Typ) erhalten, die für Ihren Code akzeptabel ist. Da in diesem Fall eine Null innerhalb von if * nicht * akzeptabel ist, verwenden Sie stattdessen '(MethodInfo) b'. Besser noch, vermeiden Sie die Kosten, um die Besetzung zweimal zu tun, indem Sie 'as' anstelle von' is' verwenden und gegen null testen. – Bevan

Verwandte Themen