Оптимизированный способ получения "get_Item" MethodInfo - PullRequest
6 голосов
/ 10 февраля 2011

Прямо сейчас у меня есть: targetType.GetMethod("get_Item", BindingFlags.Instance)

Есть что-нибудь лучше?

Ответы [ 2 ]

6 голосов
/ 10 февраля 2011

Я предпочитаю использовать PropertyInfo.GetIndexParameters:

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

Теперь indexers - это IEnumerable<MethodInfo> получателей индексаторов, которые соответствуют указанному BindingFlags, указанному вbindingFlags.

Обратите внимание, как код читается как из targetType, получите свойства, соответствующие bindingFlags, возьмите те, которые являются индексатором, и затем спроецируйте на получатель.Это гораздо менее таинственно, чем использование магической строки "get_Item", и с несколькими индексаторами легко справиться.

Если вы знаете, что есть только один, вы, конечно, можете использовать Single.Если вы ищете конкретный из многих, вы можете проверить результат GetIndexParameters соответственно.

2 голосов
/ 10 февраля 2011

Правильный способ - получить атрибут DefaultItemAttribute для класса. У него есть имя свойства индексатора. Это не обязательно должен быть «Item», языки вроде VB.NET позволяют указывать любое свойство для индексирования Код Джейсона также потерпит неудачу, их может быть более одного индексированного свойства. Но только один по умолчанию.

...