2011-02-10 9 views

Odpowiedz

6

wolę używać PropertyInfo.GetIndexParameters:

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

Teraz indexers jest IEnumerable<MethodInfo> z pobierające tych indeksujących pasujących do określonego BindingFlags podane w bindingFlags.

Zobacz, jak kod brzmi jak z targetType, uzyskaj właściwości, które pasują do bindingFlags, weź te, które są indeksem, a następnie rzutuj na gettera. Jest o wiele mniej tajemniczy niż użycie magicznej struny "get_Item", a wiele indeksatorów jest łatwo obsługiwanych.

Jeśli wiesz, że jest tylko jeden, możesz oczywiście użyć Single. Jeśli szukasz konkretnego jednego z wielu, możesz sprawdzić wynik odpowiednio GetIndexParameters.

+0

Chcę MethodInfo, a nie PropertyInfo. – smartcaveman

+0

@smartcaveman: Wow. 'Użyj PropertyInfo.GetGetMethod' na tym, co podałem powyżej. – jason

2

Właściwym sposobem jest pobranie DefaultItemAttribute dla klasy. Ma nazwę właściwości indeksera. Nie musi to być "pozycja", a języki takie jak VB.NET umożliwiają określenie dowolnej właściwości jako indekser. Kod Jason również zawiedzie, może być więcej niż jedna własność indeksowana. Ale tylko jeden domyślny.

+0

Czy posiadasz dokumentację do tego? Nie mogę go nigdzie znaleźć. – smartcaveman

+0

MSDN, spójrz na słowo kluczowe Default VB.NET i klasę DefaultMemberAttribute. –

Powiązane problemy