2016-06-07 159 views
0

我想使用反射來將KeyValuePair轉換爲對象的不同屬性。這些屬性可以是簡單類型或複雜類型。如果它們是「BaseClass的」類型的屬性我想要分配的編號和名稱:反射:設置基類型屬性

我的課表:

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;} 
} 

現在我想使用反射來分配值:

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中拆分該值,並將它們分配給目標類型。

FieldstargetType字典是typeof(TargetClass)destTargetClass一個對象。

在我的例子

所以,target可能是物業Chieffield["Chief"]可能是"23|John Doe"

但是,當我嘗試的MyBaseClass對象賦給屬性Chief(或產品)我收到一個錯誤,從轉換MyBaseClass對首席失敗。但是爲了以通用的方式使用它,我確實想對MyBaseClass派生的任何對象使用此方法

+1

而不是「新MyBaseClass {ID = ID,名字=名} ;」做「(MyBaseClass)Activator.CreateInstance(target.PropertyType)」 – Evk

+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); 
    } 
}