我想将一个字符串转换为对象属性值,其名称为字符串。我试着这样做:
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);
}
问题是,当属性类型是可空类型时,这将失败并抛出无效强制转换异常。这不是无法转换值的情况-如果我手动这样做,它们将工作(例如DateTime?d = Convert.ToDateTime(value);)我见过一些类似的问题,但仍然不能让它工作。
我也有类似的需求,而LukeH的回答为我指明了方向。我用这个通用函数来简化。
public static Tout CopyValue<Tin, Tout>(Tin from, Tout toPrototype)
{
Type underlyingT = Nullable.GetUnderlyingType(typeof(Tout));
if (underlyingT == null)
{ return (Tout)Convert.ChangeType(from, typeof(Tout)); }
else
{ return (Tout)Convert.ChangeType(from, underlyingT); }
}
用法是这样的:
NotNullableDateProperty = CopyValue(NullableDateProperty, NotNullableDateProperty);
注意,第二个参数只是作为一个原型来显示函数如何强制转换返回值,因此它实际上不必是目标属性。这意味着你也可以这样做:
DateTime? source = new DateTime(2015, 1, 1);
var dest = CopyValue(source, (string)null);
我用这种方法代替了out因为你不能在属性中使用out。实际上,它可以使用属性和变量。如果需要,也可以创建重载来传递该类型。