Это может не быть общим решением для всех разрешенных языков .NET Framework, но я в настоящее время не знаю каких-либо контрпримеров.

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

PropertyInfo[] originalProperties = myType.GetProperties();

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

Как правильно?

Исключить все свойства, гдеpropInfo.Name == "Item" это не вариант.

Ответы на вопрос(2)

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

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

Это может не быть общим решением для всех разрешенных языков .NET Framework, но я в настоящее время не знаю каких-либо контрпримеров.

Решение Вопроса

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

 Eniola23 мая 2018 г., 15:04
Да, это текущее состояние союза. Поэтому мы должны кешировать. Как насчет того, чтобы среда выполнения .NET была настроена так, чтобы явно добавлять этот флаг к метаданным, чтобы не было такого большого количества попаданий. Потому что мой сценарий включает в себя переписывание объектов, возвращаемых в WebApi, для включения значения href; это включает в себя проверку многих свойств многих типов. Так что же вы кешируете и что отпускаете, учитывая, что использование памяти может быстро расти?
 Jon Skeet20 мая 2018 г., 16:03
@Eniola: я не понимаю, почему «должен» быть более легкий (я предполагаю, что вы имеете в виду более эффективный) способ. Если вы делаете это много и заботитесь о производительности, я предлагаю вам кешировать результаты.
 Eniola20 мая 2018 г., 08:24
Хм ... Это может сработать, но это довольно тяжело. Должен быть «более легкий» способ получения этой информации.
 glopes15 янв. 2019 г., 14:00
@Eniola: результаты, по-видимому, уже кэшированы, по состоянию на последнююсправочный источник
 Jon Skeet23 мая 2018 г., 15:39
@Eniola: Это похоже на вопрос, который был задан 7 лет назад. Вы можете задать новый, конкретный вопрос.

Ваш ответ на вопрос