2010-03-22 7 views

risposta

16

MethodBase viene utilizzata come classe base di MethodInfo che ha una proprietà ReturnType.

Si potrebbe provare a trasmettere un'istanza di MethodInfo e controllare quella proprietà.

+0

E se vogliamo trovare da MemberInfo. Supponiamo che questo scenario voglia filtrare tutti i membri, come metodi e campi che sono/che restituiscono il tipo di stringa. MemberInfo ha proprietà per indicarlo? –

21

MethodBase non ha un tipo restituito perché oltre ai metodi normali viene utilizzato anche per rappresentare metodi, come i costruttori, che non hanno un tipo restituito. Invece è necessario vedere se si tratta di un'istanza di MethodInfo e verificare che per la proprietà ReturnType.

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

Prova qualcosa del genere. MethodInfo ha la proprietà ma MethodBase è utilizzato anche per i costruttori e non hanno un tipo di reso.

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

Punto minore ... se stai già controllando 'b è MethodInfo', quindi un cast diretto (MethodInfo) b' è leggermente preferibile a' b come MethodInfo'. –

+0

Come mai? :) ... –

+2

Le linee guida che seguo: Usare 'as' quando si riceve un null (per un tipo incompatibile) è accettabile per il proprio codice. In questo caso, dal momento che un null è * non * accettabile all'interno del se, utilizzare invece '(MethodInfo) b'. Meglio ancora, evita il costo di fare il cast due volte usando 'as' invece di' is' e testando nullo. – Bevan

Problemi correlati