Оптимизированный способ получения" get Item " MethodInfo


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

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

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 для класса. Он имеет имя свойства индексатора. Это не обязательно должен быть "элемент", такие языки, как VB.NET позволяет указать любое свойство в качестве индексатора. Код Джейсона также потерпит неудачу на них, там может быть более одного индексированного свойства. Но только один дефолт.