Отражение GetField() не работает из GetType(), только typeof(T) [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Отражение GetField() не работает из GetType(), только typeof(T) [дубликат]

Сообщение Anonymous »

Я столкнулся с каким-то странным поведением с отражением. Похоже на ошибку.
Я использовал отражение в своем проекте C# для доступа к общедоступным полям в различных пользовательских типах данных. Я использовал mono для запуска своего кода на Mac, но впервые я создал собственный автономный проект, используя «dotnetPublish -r osx-x64 -c Release --self-contained -p:PublishAot=true ". Все работает правильно, кроме GetField/GetFields.
Например, класс в моем проекте имеет общедоступную строку с именем name. Допустим, этот класс называется бытие.

Код: Выделить всё

//o is of type object which is an instance of being
o.GetType().GetField("name").SetValue(o, "somevalue");
Приведенная выше строка завершается сбоем, поскольку ссылка на объект не установлена ​​на экземпляр объекта, поскольку GetField("name") возвращает значение null. Точно так же GetFields() возвращает пустой массив, хотя у меня есть десятки общедоступных полей.
Причина, по которой мне это кажется ошибкой, заключается в том, что это будет работать, если я получу доступ к состоянию сначала таким образом:

Код: Выделить всё

var field = typeof(being).GetField("name");
Мне даже не нужно ничего ДЕЛАТЬ с полем. Простой вызов GetField() для typeof(being) заставит GetType() из моего экземпляра внезапно начать возвращать поля. ХМ? Как это возможно, если строка выше вообще не задействована?
Мне нужен обходной путь, независимо от того, ошибка это или нет. В некоторых случаях я не знаю тип во время компиляции, поэтому не могу выполнить typeof(being), typeof(monster) и т. д. Мне приходится полагаться на GetType().
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/779 ... ly-typeoft
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»