Оптимизированный способ получить метод "get_Item"

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

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

2 ответа

Решение

Я предпочитаю использовать 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 соответственно.

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

Другие вопросы по тегам