簡體   English   中英

反射初始化對象實例的屬性值使用

[英]Reflection Initialize Property Values of an object Instance Using

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

在處理這個問題時,我有以下代碼,但它不會更新我的對象實例的值。 我很感激能幫到這個嗎?

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

            }
        }

首先,你是否附加了一個調試器來檢查你是否進入了最嵌套的if 如果你沒有進入最嵌套的if ,你可以通過比較你期望發生的事情和你在調試器中檢查時實際發生的情況來找出原因嗎?

其次,在最嵌套的if ,你可以刪除前兩行,並用第三行中的propertyInfo替換property (這將是刪除前兩行時剩余的唯一行)。 你已經掌握了具有給定名稱的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
    }
}

請注意,這正是您的邏輯,它的工作原理 這有幫助嗎?

如果你把它切換起來它會更好嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM