2014-01-09 40 views
0

我試圖「向上」一個實體。實體B只有幾個propeties。Refelection將屬性轉換爲另一個實例

實體:

public class A 
{ 
    public String Name { get; set; } 
} 

public class B : A 
{ 
    public String ForeName { get; set; } 
} 

我想A.Name價值CONVER到B.Name編程。 從來就寫了一個小功能的話:

public static T Upcast<T>(Type typeOf, Object obj) where T : new() 
{ 
    var target = new T(); 
    var props = obj.GetType().GetProperties(); 
    var targetProps = target.GetType().GetProperties(); 

    foreach (var prop in props) 
    { 
     foreach (var tp in targetProps) 
     { 
      if (prop.Name.Equals(tp.Name)) 
      { 
       var val = prop.GetValue(props, null); 
       tp.SetValue(null, val, null); 
      } 
     } 
    } 

    return target; 
} 

在這種情況下:我的目標是B類和我obj爲A類

但是,在第二循環中觸發一個例外:

var val = prop.GetValue(props, null); 

異常「對象與目標類型不匹配」。

我呼籲正常方式功能:

static void Main(string[] args) 
{ 
    var a = new A {Name = "Smith"}; 

    var resp = Upcast<B>(a.GetType(), a); 
    Console.ReadLine(); 
} 
+1

只是出於好奇:你爲什麼要通過反射來做到這一點,而不是在'B'中有一個構造函數,它需要'A'的一個實例並從中初始化? –

回答

1

更換prop.GetValue(props, null);prop.GetValue(obj, null);

它給了我 「史密斯」。

+0

謝謝,多麼容易! :-) – Ipad

0

與.NET 4.5開始,你可以寫

var val = prop.GetValue(obj); 

您正在嘗試讀值出的PropertyInfo類的一個實例。但是你想要的是從你的實例A中讀取值。

另一個暗示,用於更簡潔的代碼: 不要傳遞A的類型作爲參數。如果你傳遞一個A的實例,你的方法可以使obj.GetType()。

但是:你爲什麼這樣做?

+0

這是行不通的: 無法解決Method Candiate是: GetValue(object,object []) – Ipad

+0

OK,然後使用prop.GetValue(obj,null),如另一個答案中所假定的。 GetValue(obj).NET 4.5中的新功能 –

+0

工作正常,謝謝! – Ipad

1

必須與目標對象調用prop.GetValue(...);的說法,不符合屬性集合:

prop.GetValue(obj, null); 
相關問題