2011-02-10 14 views

risposta

6

Io preferisco usare PropertyInfo.GetIndexParameters:

var indexers = targetType.GetProperties(bindingFlags) 
         .Where(p => p.GetIndexParameters().Any()); 
         .Select(p => p.GetGetMethod()); 

Ora indexers è una IEnumerable<MethodInfo> dei getter degli indicizzatori che corrispondono al specificato BindingFlags data in bindingFlags.

Nota come il codice si legge come da targetType, ottenere le proprietà corrispondenti allo bindingFlags, prendere quelle che sono un indicizzatore e quindi proiettare sul getter. È molto meno misterioso dell'uso della stringa magica "get_Item" e gli indicizzatori multipli vengono gestiti facilmente.

Se sai che ce n'è solo uno, potresti ovviamente usare Single. Se stai cercando uno specifico di molti, puoi controllare il risultato di GetIndexParameters di conseguenza.

+0

Voglio il MethodInfo, non il PropertyInfo. – smartcaveman

+0

@smartcaveman: Wow. 'Usa PropertyInfo.GetGetMethod' su ciò che ti ho dato sopra. – jason

2

Il modo corretto consiste nel recuperare DefaultItemAttribute per la classe. Ha il nome della proprietà dell'indicizzatore. Non deve essere "Articolo", lingue come VB.NET consente di specificare qualsiasi proprietà come indicizzatore. Il codice di Jason fallirà anche su di loro, ci possono essere più di una proprietà indicizzata. Ma solo un default.

+0

Avete documentazione per questo? Non riesco a trovarlo da nessuna parte. – smartcaveman

+0

MSDN, guarda la parola chiave Default VB.NET e la classe DefaultMemberAttribute. –