反思:设置基类

时间:2016-06-07 16:50:09

标签: c# reflection

我想使用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);
    }
}

因此,如果该字段包含“|”我想在IdTitle中拆分该值并将其分配给目标类型。

FieldstargetTypetypeof(TargetClass)的词典,dest是[{1}}的对象。

因此,在我的示例中,TargetClass可以是属性targetChief可以是field["Chief"]

但是当我尝试将"23|John Doe"的对象分配给属性MyBaseClass(或产品)时,我收到一条错误,即从MyBaseClass到Chief的转换失败。但是要以通用的方式使用它,我确实希望在从Chief派生的任何Object上使用此方法

1 个答案:

答案 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);
  }
}