使用反射将值赋给动态类型,并绕过GetValue返回的对象强制转换ox



我有两个具有完全相同属性的对象。下面是一个例子:

public class Field<T>
{
   public T Value {get;set;}
   // more things
}
public class MainObject
{
   public string MyStr {get;set;}
   public int? MyInt {get;set;}
   public bool? MyBool {get;set;}
}
public class MainObjectField
{
   public Field<string> MyStr {get;set;}
   public Field<int?> MyInt {get;set;}
   public Field<bool?> MyBool {get;set;}
}

我有一个任务,根据从外部源获得的xpath指令创建MainObjectField的实例。
我需要从MainObject的实例中获取Value作为任务的一部分。

因为我不知道编译类型中当前属性的类型,所以我使用动态变量。

这里有一个简短的例子(这是不是代码在现实生活中的样子-这个例子是为了简化文章):

MainObject obj = new MainObject
{
    MyBool = true,
    MyInt = 12,
    MyStr = "Example"
};
MainObjectField fieldObj = new MainObjectField();
var myBool = obj.GetType().GetProperty("MyBool").GetValue(obj);
var myInt = obj.GetType().GetProperty("MyInt").GetValue(obj);
var myStr = obj.GetType().GetProperty("MyStr").GetValue(obj);
dynamic fieldBool = Activator.CreateInstance(typeof(Field<bool?>));
dynamic fieldInt = Activator.CreateInstance(typeof(Field<int?>));
dynamic fieldString = Activator.CreateInstance(typeof(Field<string>));
fieldBool.Value = myBool; // exception
fieldInt.Value = myInt; // exception
fieldString.Value = myStr; // exception 
fieldObj.MyBool = fieldBool;
fieldObj.MyInt = fieldInt;
fieldObj.MyStr = fieldString;

现在我得到了这个异常:

不能隐式地将类型"object"转换为"bool"。一个显式的存在转换(您是否缺少强制类型转换?)

我明白为什么我得到异常,我正试图找到一个解决方法。

我知道currentField.Valueval值应该是相同的类型。

我的问题是使用反射(GetValue返回object)自动将boxes的值转换为object并破坏我的计划。我不能转换为"正确"的值,因为我只在运行时知道类型。

我该如何解决这个问题?

问题是绑定器将使用静态类型的值你试图分配给属性-而你想动态地做到这一点。您所需要做的就是将变量类型更改为dynamic,它就可以工作了:

dynamic myBool = obj.GetType().GetProperty("MyBool").GetValue(obj);
dynamic myInt = obj.GetType().GetProperty("MyInt").GetValue(obj);
dynamic myStr = obj.GetType().GetProperty("MyStr").GetValue(obj);

基本上,动态类型将动态地处理任何编译时类型为dynamic的表达式,但是在执行绑定时将使用任何其他表达式的编译时类型。

相关内容

  • 没有找到相关文章

最新更新