Как перечислить поля текущего класса в C # Reflection (проблема с this.GetType ())? - PullRequest
4 голосов
/ 29 января 2011

Это принято компилятором:

FieldInfo[] fieldInfos;
fieldInfos = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

Это НЕ принято компилятором:

FieldInfo[] fieldInfos;
fieldInfos = typeof(this.GetType()).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

Как исправить второй синтаксис?

Ответы [ 4 ]

9 голосов
/ 29 января 2011

Вам не нужно typeof() при вызове GetType, поскольку он уже возвращает объект Type.typeof - это специальный синтаксис для получения объекта Type из имени типа, без необходимости делать что-то вроде Type.GetType("Foo").

FieldInfo[] fieldInfos;
fieldInfos = GetType().GetFields(BindingFlags.NonPublic |
                                 BindingFlags.Instance);
2 голосов
/ 29 января 2011
FieldInfo[] fieldInfos = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
2 голосов
/ 29 января 2011

Вам не нужно typeof во втором примере. Просто используйте:

 FieldInfo[] fieldInfos = this.GetType().GetFields(BindingFlags.NonPublic |
                                                   BindingFlags.Instance);

Смысл typeof в том, что это своего рода «буквальный» формат для получения ссылки Type. GetType() уже возвращает тип, поэтому он вам не нужен.

Другими словами, предположим, что вам нужна строка ... вы бы не использовали:

string x = "y.ToString()";

вы бы просто использовали

string x = y.ToString();

Заменить кавычки на typeof(), и это то же самое ...

2 голосов
/ 29 января 2011

typeof не позволяет вам передать экземпляр System.Type. typeof - это оператор, единственным параметром которого является тип (например, Int32, или object, или MyClass), и он возвращает экземпляр System.Type. Если у вас уже есть экземпляр объекта, просто вызовите GetType, чтобы получить экземпляр System.Type. Поэтому просто скажите

fieldInfos = this.GetType()
                 .GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...