2017-02-24 77 views
0

我想設置值的許多對象的屬性。 我有一個函數接收2個參數MyStructuredObjects和MyObject MyStructuredObjects有一個MyObjects列表。 這個函數是一個重新刪除大量'if'的工廠。SetValue方法拋出異常時使用反射

我想使用永遠相同的對象,因爲它在循環中使用的功能。如果可能的話。 我得到了異常'對象不符合目標'。 對不起,發佈這個,但我沒有發現這樣的問題,使用對象結構中的列表。

請看:

public class MyStructuredObjects 
{ 
    public List<MyObject1> Object1 { get; set; } 
    public List<MyObject2> Object2 { get; set; } 
    public List<MyObject3> Object3 { get; set; } 
    public List<MyObject4> Object4 { get; set; } 
    public List<MyObject5> Object5 { get; set; } 
} 

private void SetValuesToObjectsToIntegrate<T>(ref MyStructuredObjects returnedObject, T obj) 
{ 
    Type t = obj.GetType(); 
    var propertyInfo = new ObjectsToIntegrate().GetType().GetProperties(); 
    var instance = Activator.CreateInstance(t); 
    foreach (var item in returnedObject.GetType().GetProperties()) 
    { 
     var itemType = item.PropertyType; 
     if (t == itemType)  // PASSING BY HERE OK , it finds the same type :P 
     { 
      item.SetValue(t, Convert.ChangeType(obj, item.PropertyType), null); 
     } 
    } 
} 

更新:代碼應該是:

item.SetValue(instance, Convert.ChangeType(obj, item.PropertyType), null); 
+0

'SetValue'預期的*實例*。你只是通過它的類型。你可能想使用'item.SetValue(returnedObject ...' – Rob

+0

嗨羅布,更改爲'代碼 item.SetValue(實例,Convert.ChangeType(obj,item.PropertyType),null);' 但是不工作 –

+0

@Summerson - 請不要編輯您的問題以使評論失效。當嘗試幫助您時,歷史記錄很重要。 – Enigmativity

回答

0

我想我明白你想要做什麼。

看樣子,你想設置屬性是這樣的:

var o2 = new List<MyObject2>(); 
var mso = new MyStructuredObjects(); 
SetValuesToObjectsToIntegrate(ref mso, o2); 

這樣mso將其屬性Object2集,因爲o2類型的屬性類型相匹配。

如果是這樣的話,那麼你只需要驗證碼:

private void SetValuesToObjectsToIntegrate<T>(MyStructuredObjects returnedObject, T obj) 
{ 
    foreach (var propertyInfo in typeof(MyStructuredObjects).GetProperties()) 
    { 
     if (typeof(T) == propertyInfo.PropertyType) 
     { 
      propertyInfo.SetValue(returnedObject, obj, null); 
     } 
    } 
} 

有沒有必要通過ref傳遞MyStructuredObjects returnedObject因爲你不改變returnedObject實例。

使用此調用此代碼:

var o2 = new List<MyObject2>(); 
var mso = new MyStructuredObjects(); 
SetValuesToObjectsToIntegrate(mso, o2); 

這個電話之後,我現在得到:

result