2012-09-10 11 views
11

Ho il seguente albero di classe:C# GetMethod non restituisce un metodo genitore

public class A 
{ 
    public static object GetMe(SomeOtherClass something) 
    { 
     return something.Foo(); 
    } 
} 

public class B:A 
{ 
    public static new object GetMe(SomeOtherClass something) 
    { 
     return something.Bar(); 
    } 
} 

public class C:B 
{ 

} 

public class SomeOtherClass 
{ 

} 

Dato SomeOtherClass parameter = new SomeOtherClass()) questo funziona:

typeof(B).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter)); 

Ma questo:

typeof(C).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter)); 

getta a NullReferenceException, mentre vorrei che chiamasse lo stesso metodo esattamente come sopra.

Ho provato diverse bandiere di associazione inutilmente. Qualsiasi aiuto?

risposta

19

È necessario utilizzare uno overloads prendendo un parametro BindingFlags e includere FlattenHierarchy.

Specifica che i membri statici pubblici e protetti della gerarchia devono essere restituiti. I membri statici privati ​​nelle classi ereditate non vengono restituiti. I membri statici includono campi, metodi, eventi e proprietà. I tipi annidati non vengono restituiti.

(A cura di rimuovere il punto sui metodi statici privati, ora la questione è stata modificata per renderli pubblici.)

+0

I metodi sono statici pubblici, ho storto la domanda (e ho pensato di avere la prova leggerlo D :). Grazie ancora! –

+1

@ SebastiánVansteenkiste: In tal caso, la semplice modifica dei flag di bind per includere FlattenHierarchy (e statica e pubblica) dovrebbe andare bene. –

+0

Mille grazie! Per le future generazioni: 'typeof (C) .GetMethod (" GetMe ", BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static, null, new Tipo [] {typeof (SomeOtherClass)}, null)). Invoca (null , parametro)); ha fatto il trucco. –

4

È necessario passare BindingFlags.FlattenHierarchy bandiera per GetMethod al fine di ricercare la gerarchia:

typeof(C).GetMethod("GetMe", BindingFlags.FlattenHierarchy, null, new Type[] { typeof(SomeOtherClass) }, null)).Invoke(null, parameter)); 
+0

Mi sembra di aver perso 'FlattenHierarchy' .. Grazie, ci proverò adesso! –

+1

L'aggiunta di 'FlattenHierarchy' ma anche' Public' e 'Static' l'hanno risolto. –

Problemi correlati