Я хочу преобразовать строку в значение свойства объекта, имя которого у меня есть в виде строки. Я пытаюсь сделать это так:
string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
property.SetValue(entity,
Convert.ChangeType(value, property.PropertyType), null);
}
Проблема заключается в том, что происходит сбой и генерируется исключение недопустимого приведения, когда тип свойства имеет тип NULL. Это не тот случай, когда значения невозможно преобразовать - они будут работать, если я сделаю это вручную (например, DateTime? d = Convert.ToDateTime(value);
я видел несколько похожих вопросов, но все еще не могу заставить их работать).
c#
.net
reflection
iboeno
источник
источник
Ответы:
Не проверено, но, возможно, что-то вроде этого будет работать:
источник
(value == null) ? null
использования(value == null) ? default(t)
?safeValue
переменной, а не просто для переназначенияvalue
?Вы должны получить базовый тип, чтобы сделать это ...
Попробуйте это, я успешно использовал это с дженериками:
Я использую его в ряде мест в своем коде, один из примеров - вспомогательный метод, который я использую для преобразования значений в базе данных безопасным способом:
Вызывается с помощью:
Я написал серию постов в блоге, включая эту, на http://www.endswithsaurus.com/2010_07_01_archive.html (прокрутите вниз до добавления, @JohnMacintyre фактически обнаружил ошибку в моем исходном коде, которая привела меня по тому же пути, по которому вы сейчас). С тех пор у меня есть несколько небольших модификаций, которые включают преобразование типов enum, поэтому, если ваше свойство является Enum, вы все равно можете использовать тот же вызов метода. Просто добавьте строку, чтобы проверить типы перечислений, и вы приступите к гонкам, используя что-то вроде:
Обычно у вас есть некоторая проверка ошибок или использование TryParse вместо Parse, но вы получите картину.
источник
Это немного длинновато для примера, но это относительно надежный подход, который отделяет задачу приведения от неизвестного значения к неизвестному типу.
У меня есть метод TryCast, который делает что-то подобное, и принимает во внимание обнуляемые типы.
Конечно, TryCast - это метод с параметром типа, поэтому для его динамического вызова необходимо создать MethodInfo самостоятельно:
Затем, чтобы установить фактическое значение свойства:
И методы расширения, чтобы иметь дело со свойством. CanAssignValue ...
источник
У меня была похожая потребность, и ответ от LukeH указал мне направление. Я придумал эту общую функцию, чтобы упростить ее.
Использование это так:
Обратите внимание, что второй параметр просто используется в качестве прототипа, чтобы показать функции, как приводить возвращаемое значение, поэтому он не обязательно должен быть свойством назначения. Это означает, что вы можете сделать что-то вроде этого:
Я сделал это таким образом вместо использования out, потому что вы не можете использовать со свойствами. Как есть, он может работать со свойствами и переменными. Вы также можете создать перегрузку для передачи типа, если хотите.
источник
Спасибо @LukeH
Я немного изменился:
источник
Я сделал это таким образом
источник