2016-11-26 3 views
0

Похоже Reflection возвращает отступающие поля для свойств, если называется так:Отражение возвращает поля заднего плана свойств только для чтения?

type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 

Есть ли способ, чтобы вернуть все поля, которые были объявлены пользователем в классе без отступающих полей/составитель сгенерированных полей/т. д.?

EDIT: Можно ли положиться на атрибут [CompilerGenerated]?

+0

Безопасности не двоичная. Вопрос «безопасен ли он» должен быть «достаточно ли он безопасен», что, в свою очередь, подсказывает, что противодействие «достаточно безопасно для чего?». Учтите, что во время выполнения можно динамически создавать типы, содержащие поля, неотличимые от тех, которые заданы во время компиляции. Учтите также, что есть общие библиотеки, которые создают такие типы во время выполнения, и что в вашем вопросе нет информации о том, используете ли вы их. – hvd

ответ

1

Все такие поля помечены CompilerGeneratedAttribute, так что вы можете выбирать, как это:

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null).ToArray(); 
Смежные вопросы