反射初始化对象实例的属性值使用

Kob*_*kie 1 c# reflection

我有一个对象实例。在对象的构造函数中,我希望允许用户传入一个字典,用它来初始化对象的一些(如果不是全部)属性。现在,我不想使用条件,而是使用反射,反射对象实例中包含的属性,如果属性名称映射到字典中的键,则使用相应的值更新属性值在字典中。

在处理此问题时,我有以下代码,但它不会更新我的对象实例的值。希望您能提供一些帮助让其正常工作吗?

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

            }
        }
Run Code Online (Sandbox Code Playgroud)

jas*_*son 5

首先,您是否附加了调试器来检查是否进入了最嵌套的内部if?如果您没有进入最嵌套的内部if,您能否通过将预期发生的情况与在调试器中检查时实际发生的情况进行比较来找出原因?

其次,在最嵌套的 内if,您可以删除前两行,并在第三行中替换为propertypropertyInfo这将是删除前两行时剩下的唯一行)。您已经掌握了PropertyInfo给定名称的信息,为什么还要再次查找呢?

除此之外,看起来你所拥有的应该有效。因此,错误存在于其他地方,这意味着您没有传递正确的值,或者您没有告诉我们正在发生的其他事情。

这是一个可以帮助您的示例

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
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这正是您的逻辑并且有效。这有帮助吗?