PropertyInfo : является ли свойство индексатором?

У меня есть следующий код:

PropertyInfo[] originalProperties = myType.GetProperties();

Я хочу исключить из originalProperties все индексаторы (myVar["key"] отображается как свойство с именем "Item").

Каков правильный путь?

Исключите все свойства, для которых propInfo.Name == "Item" не подходит.


person JYL    schedule 20.01.2011    source источник


Ответы (2)


Вызовите PropertyInfo.GetIndexParameters, если возвращаемый массив пуст. , это не индексатор.

person Jon Skeet    schedule 20.01.2011
comment
Хм... Это может сработать, но это довольно тяжело. Должен быть более легкий способ получить эту информацию. - person Eniola; 20.05.2018
comment
@Eniola: Я не понимаю, почему должен быть более легкий (под чем я полагаю, вы имеете в виду более эффективный) способ. Если вы делаете это часто и заботитесь о производительности, я предлагаю кэшировать результаты. - person Jon Skeet; 20.05.2018
comment
Да, это текущее состояние профсоюза. Итак, мы должны кэшировать. Как насчет того, чтобы среда выполнения .NET, которую мы настроили, явно добавляла этот флаг в метаданные, чтобы не было такого большого количества попаданий. Поскольку мой сценарий включает в себя переписывание объектов, возвращаемых в WebApi, для включения значения href; это включает в себя проверку множества свойств многих типов. Итак, что вы кэшируете, а что отпускаете, учитывая, что использование памяти может быстро расти? - person Eniola; 23.05.2018
comment
@Eniola: Это похоже на вопрос, несколько отличающийся от того, который задавали 7 лет назад. Вы можете задать новый конкретный вопрос. - person Jon Skeet; 23.05.2018
comment
@Eniola: результаты, по-видимому, уже кэшированы, начиная с последней источник ссылки - person glopes; 15.01.2019

Другой вариант — использовать:

myType.GetProperties().Except(myType.GetDefaultMembers().OfType<PropertyInfo>());

GetDefaultMembers вернет все созданные компилятором индексаторы в C#. Это имеет то преимущество, что не нужно размышлять о каждом отдельном свойстве, чтобы выяснить, какие из них являются индексаторами.

Возможно, это не общее решение для всех разрешенных языков фреймворка .NET, но в настоящее время мне неизвестны какие-либо контрпримеры.

person glopes    schedule 15.01.2019