我有一个第三方库,它使用反射设置给定的对象属性,如下所示。(这是简化版)
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?
所以这是我的情况......有什么帮助吗?