2013-06-21 130 views
0

我有一個對象實例。在Object的構造函數中,我希望允許用戶傳入一個字典,用來初始化一些(如果不是全部)對象的屬性。現在,我不想使用條件,我想要做的是使用反射,反映對象實例中包含的屬性,並且如果屬性名稱映射到字典中的鍵,則使用相應的值更新屬性值在字典中。反射初始化對象實例的屬性值使用

在此工作中,我有以下代碼,但它不會更新我的對象實例的值。希望有一些幫助,讓這個工作,請?

public void Initialize() 
     { 
      if (Report.GlobalParameters != null) 
      { 
       PropertyInfo[] propertyInfos = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 
       foreach (PropertyInfo propertyInfo in propertyInfos) 
       { 
        if (Report.GlobalParameters.ContainsKey(propertyInfo.Name)) 
        { 
         Type type = this.GetType(); 
         PropertyInfo property = type.GetProperty(propertyInfo.Name); 
         property.SetValue(this, Report.GlobalParameters[propertyInfo.Name], null); 
        } 
       } 

      } 
     } 
+0

該對象的示例會很好(只顯示「不更新我的對象實例的值」的屬性)。在後期簡化抽樣以使用硬編碼名稱和價值也是一個好主意。 –

+1

我已經試過你創建的Person對象上的代碼,它運行良好,沒有問題?! –

+0

謝謝,我查了一下,現在看起來工作正常。不知道我改變了什麼。謝謝。 – Kobojunkie

回答

2

首先,你是否附加了一個調試器來檢查你是否進入最嵌套的if?如果你沒有進入嵌套最多的if,你能通過比較你希望發生的事情和在調試器中檢查實際發生的事情時找出原因嗎?其次,在最內嵌的if內部,可以刪除前兩行,並在第三行中替換propertypropertyInfo(這將是刪除前兩行時剩下的唯一行)。你已經有PropertyInfo這個名字了,你爲什麼要再看一遍?

除此之外,它看起來像你應該工作。因此,其他地方存在錯誤,這意味着你沒有傳遞正確的價值觀,或者你沒有告訴我們的其他事情正在發生。

這裏是你有什麼,應該幫助你small working example

using System; 
using System.Collections.Generic; 

class Foo { 
    public int Bar { get; set; } 
    public Foo(Dictionary<string, object> values) { 
     var propertyInfo = this.GetType().GetProperties(); 
     foreach(var property in propertyInfo) { 
      if(values.ContainsKey(property.Name)) { 
       property.SetValue(this, values[property.Name], null); 
      } 
     } 
    } 
} 

class Program { 
    public static void Main(String[] args) { 
     Dictionary<string, object> values = new Dictionary<string, object>(); 
     values.Add("Bar", 42); 
     Foo foo = new Foo(values); 
     Console.WriteLine(foo.Bar); // expect 42 
    } 
} 

發現它正是你的邏輯和它works。這有幫助嗎?

-1

如果切換它並且執行操作會更好嗎?

public void Initialize() 
    { 
     if (Report.GlobalParameters != null) 
     { 
      foreach (KeyValuePair<string, object> kvp in Report.GlobalParameters) 
      { 
       PropertyInfo pi = this.GetType().GetProperty(kvp.Key, BindingFlags.Public | BindingFlags.Instance); 
       if (pi != null) 
       { 
        try 
        { 
         pi.SetValue(this, kvp.Value, null); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(kvp.Key + Environment.NewLine + ex.ToString(), "Error Setting Property Value"); 
        } 
       } 
       else 
       { 
        MessageBox.Show(kvp.Key, "Property Not Found"); 
       } 
      } 
     } 
    } 
+0

Downvote是因爲?... –