2012-02-29 6 views
6

Dato: Istanza System.Type.Come ottenere metodi in un tipo

L'obiettivo è quello di ottenere i metodi di nuova introduzione (non so la parola giusta) nel tipo, che sono - non ha ereditato - non sovrascritto

voglio usare .NET Riflessione e Ho provato il metodo Type.GetMethods(). Ma, è ritornato anche a quelli ereditati e sovrascritti.

Ho pensato di filtrare dopo aver ottenuto tutti i metodi. E ho esaminato le proprietà/metodi esposti dalla classe MethodInfo. Non riuscivo a capire come ottenere ciò che volevo.

Per esempio: Ho una classe, class A { void Foo() { } }

Quando invoco typeof(A).GetMethods(), ottengo Foo insieme con i metodi in System.Object: Equals, ToString, GetType e GetHashCode. Voglio filtrarlo a solo Foo.

Qualcuno sa come fare?

Grazie.

+1

metodi ereditati e sovrascritto appartengono al tipo. Perché ti aspetteresti che non vengano elencati? Puoi spiegare per favore cosa stai cercando di realizzare? – asawyer

+0

Sto provando a generare un rapporto che dice che questi metodi sono stati aggiunti alla libreria/al prodotto. E non voglio elencare i metodi ereditati/sovrascritti a causa dei requisiti aziendali. Devono essere segnalati come parte del loro tipo di definizione. – pnvn

risposta

8

GetMethods ha un sovraccarico che consente di specificare BindingFlags. Per esempio. quindi se hai bisogno di ottenere tutti i metodi di istanza pubblici, dichiarati devi passare i flag corrispondenti.

var declaredPublicInstanceMethods = 
    typeof(A).GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); 
+0

Grazie. Questo ha funzionato per la maggior parte. I metodi sottoposti a override continuano a essere visualizzati. – pnvn

+1

Bene, se A sostituisce un metodo, quel metodo fa parte delle dichiarazioni del tipo, quindi perché no? –

0

è possibile filtrare la collezione MethodInfo restituita da DeclaringType:

var methods = typeof(A).GetMethods().Where(mi => mi.DeclaringType== typeof(A)); 
2

Spero che questo era ciò che si vuole

var methods = typeof(MyType).GetMethods(System.Reflection.BindingFlags.DeclaredOnly); 
+0

Non ha funzionato. Per qualche ragione, la bandiera DeclaredOnly da sola non è sufficiente. Grazie comunque. – pnvn