【发布时间】:2013-04-25 13:48:03
【问题描述】:
我有一个第三方库,它使用反射设置给定的对象属性,如下所示。 (这是简化版)
public void Set(object obj, string prop, object value) {
var propInf = obj.GetType().GetProperty(prop);
value = Convert.ChangeType(value, propInf.PropertyType);
propInf.SetValue(obj, value, null);
}
我们有一个可以为空属性的类
class Test
{
public int? X { get; set; }
}
当我编写以下代码时,它说它无法将int 转换为int?
var t = new Test();
Set(t, "X", 1);
由于 Nullable 没有实现 IConvertible 它是有意义的。然后我决定编写一个返回给定值类型对象的可为空版本的方法。
public object MakeNullable(object obj) {
if(obj == null || !obj.GetType().IsValueType)
throw new Exception("obj must be value type!");
return Activator.CreateInstance(
typeof(Nullable<>).MakeGenericType(obj.GetType()),
new[] { obj });
}
我希望如下使用这个方法。
var t = new Test();
Set(t, "X", MakeNullable(1));
但它仍然说它无法将int 转换为int?。当我调试typeof(Nullable<>).MakeGenericType(obj.GetType()) 等于int? 但Activator.CreateInstace 返回int 值而不是int?
所以这是我的情况...有什么帮助吗?
【问题讨论】:
-
您找到解决方案了吗?我一直在玩 Activator 等大约一个小时,但没有任何运气。它总是返回内存中的底层类型。
标签: c# reflection type-conversion nullable activator