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