2013-06-21 200 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是因为?... –