我想使用Reflection将KeyValuePair转换为对象的不同属性。这些属性可以是简单类型或复杂类型。如果它们是“BaseClass”类型的属性,我想分配Id和Name:
我的课程:
public class MyBaseClass {
public int Id { get;set;}
public string Name {get; set;}
}
public class Person:MyBaseClass {
public int Age {get;set;}
}
public class Item:MyBaseClass {
public decimal Price {get;set;}
}
public class TargetClass {
public Person Chief {get;set;}
public Item Product {get;set;}
}
现在我想使用Reflection来分配值:
foreach (var field in Fields) {
var target=targetType.GetProperty(field.Key);
if (field.Value.indexOf("|")>0) {
int id=int.Parse(field.Value.Split('|')[0]);
string name=field.Value.Split('|')[1];
var baseObj = new MyBaseClass { Id = id, Name=name };
target.SetValue(dest, baseObj);
} else {
target.SetValue(dest,field.Value);
}
}
因此,如果该字段包含“|”我想在Id
和Title
中拆分该值并将其分配给目标类型。
Fields
是targetType
为typeof(TargetClass)
的词典,dest
是[{1}}的对象。
因此,在我的示例中,TargetClass
可以是属性target
,Chief
可以是field["Chief"]
但是当我尝试将"23|John Doe"
的对象分配给属性MyBaseClass
(或产品)时,我收到一条错误,即从MyBaseClass到Chief的转换失败。但是要以通用的方式使用它,我确实希望在从Chief
派生的任何Object上使用此方法。
答案 0 :(得分:1)
它不起作用,因为您尝试将基类(MyBaseClass
)的实例分配给期望子类实例(Person
)的属性。如果您可以确定从MyBaseClass
继承的所有类都具有无参数公共构造函数 - 通过反射创建期望类型的新实例并将其强制转换为MyBaseClass
:
foreach (var field in Fields) {
var target=targetType.GetProperty(field.Key);
if (field.Value.indexOf("|")>0) {
int id=int.Parse(field.Value.Split('|')[0]);
string name=field.Value.Split('|')[1];
var baseObj = (MyBaseClass) Activator.CreateInstance(target.PropertyType);
baseObj.Id = id;
baseObj.Name = name;
target.SetValue(dest, baseObj);
} else {
target.SetValue(dest,field.Value);
}
}