Отражение возвращает резервные поля свойств только для чтения?

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

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

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

EDIT: Безопасно ли полагаться на атрибут [CompilerGenerated]?


person D.R.    schedule 26.11.2016    source источник
comment
Безопасность не бинарна. Вопрос о том, безопасно ли это, должен быть достаточно ли он безопасен, что, в свою очередь, вызывает встречный вопрос, достаточно безопасный для чего? Учтите, что можно динамически создавать типы во время выполнения, которые содержат поля, неотличимые от полей в типах, определенных во время компиляции. Учтите также, что существуют общие библиотеки, которые создают такие типы во время выполнения, и что в вашем вопросе нет информации о том, используете ли вы их.   -  person    schedule 26.11.2016


Ответы (1)


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

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null).ToArray();
person Evk    schedule 26.11.2016