C #: динамическое преобразование примитива в Nullable <> - PullRequest
4 голосов
/ 13 декабря 2011

Я использую отражение, чтобы перебрать свойства объектов. Для типов Nullable<> тип возвращается правильно с использованием свойства PropertyType. Однако, когда я вызываю свойство getter (через PropertyType.GetGetMethod().Invoke(obj, new object[0]) или PropertyType.GetValue(obj, null), тип результата - это развернутый примитив, а не Nullable<>. Nullable<> type. Выдает InvalidCastException в таких случаях:

Convert.ChangeType(property.GetValue(obj, null), property.PropertyType);

Есть ли другой способ убедиться, что тип значения свойства всегда совпадает с типом свойства?

1 Ответ

5 голосов
/ 13 декабря 2011

Вы не можете сделать это в коде отражения, потому что в коде отражения вы говорите о object, и там нет такой вещи , как в штучной упаковке Nullable<T> - это либо коробочное базовое значение, или null.

Если вы знаете фактический тип, вы можете использовать конструктор для создания переносимого значения, но оно должно быть назначено только типизированному полю / переменной, Nullable<T> - не object - иначе CLI снова развернет его.

Однако, по той же причине, вам не нужно оборачивать при использовании отражения; любой код типа SetValue примет object и будет делать правильные вещи; независимо от того, является ли это null или базовым значением в штучной упаковке, оно будет обработано правильно.

По сути, CLI имеет особую обработку при упаковке и распаковке Nullable<T>, что делает вопрос недействительным.

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