2010-09-07 10 views
16

Io uso Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) per recuperare una matrice di metodi per un determinato tipo.Filtraggio dei metodi generati automaticamente (getter/setter/add/remove/.etc) restituiti da Type.GetMethods()

Il problema è che il MethodInfo restituito potrebbe includere metodi generati dal compilatore che non desidero. Per esempio:

  • proprietà bool Enabled { get; } sarà ottenere bool get_Enabled()

  • evento SomethingChanged otterrà add_SomethingChanged(EventHandler) e remove_SomethingChanged(EventHandler)

Probabilmente posso aggiungere un po 'di logica filtro per sbarazzarsi di loro che potrebbe potenzialmente diventare molto complicato. Voglio sapere se c'è qualcos'altro che posso fare, ad esempio con le impostazioni BindingFlags, per recuperare solo i metodi definiti dall'utente?

+0

possibile duplicato [Trovare il PropertyInfo ospita dal MethodInfo di getter/setter] (http://stackoverflow.com/questions/520138/finding-the-hosting-propertyinfo-from-the- methodinfo-of-getter-setter) –

risposta

25
typeof(MyType) 
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
    .Where(m => !m.IsSpecialName) 
+0

Non ho preso in considerazione la concorrenza, ma che cosa rende l'uso di entrambi contemporaneamente pericoloso? Quando ho cercato su google, ho visto alcuni post precedenti del forum che dicevano che IsSpecialName era inaffidabile in alcuni casi, ma dal momento che ne stavano parlando nel contesto di .NET 1.0 ho appena pensato che questo problema fosse stato risolto prima o in 3.5. – Dan7

2

Penso che la soluzione migliore sarebbe quella di filtrare i metodi che hanno l'attributo CompilerGenerated. È probabile che ciò sia più a prova di futuro, sebbene ciò non tenga conto di futuri compilatori ipotetici che non rispettano completamente questo attributo. Il test IsSpecialName è probabilmente anche, poiché sembra che il compilatore C# non colleghi l'attributo ai metodi add e remove.

+0

Si potrebbe usare 'Dove (m =>! M.GetCustomAttributes (typeof (CompilerGeneratedAttribute), true) .Any())' per filtrarli. Non sembra chiaro se la mia risposta o la tua risposta siano migliori. –

+0

Ehi. Dopo qualche test in più mi sono sbagliato a capire che l'attributo CompilerGenerated funzioni, in realtà no. I miei metodi getter/setter/add/remove non hanno questo attributo. Strano. Forse è solo collegato ai metodi di auto-implementazione? E i metodi setter/getter con implementazione utente non ottengono questo attributo. – Dan7

+0

@ Dan7 hai trovato ne vale la pena utilizzare entrambi i metodi contemporaneamente? Non sembra che le persone siano d'accordo su quale sia il modo migliore. –

-1

Il segreto è BindingFlags. DeclaredOnly

typeof(MyType).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) 
Problemi correlati