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