簡體   English   中英

在C#中枚舉對象的屬性(字符串)

[英]Enumerating through an object's properties (string) in C#

假設我有很多對象,它們有很多字符串屬性。

是否有一種編程方式來瀏覽它們並輸出屬性名及其值,還是必須進行硬編碼?

是否可能有LINQ方法來查詢對象的'string'類型的屬性並輸出它們?

您是否需要對要回顯的屬性名稱進行硬編碼?

使用反射。 它遠不及硬編碼屬性訪問速度快,但它可以滿足您的需求。

以下查詢為對象'myObject'中的每個字符串類型屬性生成一個具有Name和Value屬性的匿名類型:

var stringPropertyNamesAndValues = myObject.GetType()
    .GetProperties()
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
    .Select(pi => new 
    {
        Name = pi.Name,
        Value = pi.GetGetMethod().Invoke(myObject, null)
    });

用法:

foreach (var pair in stringPropertyNamesAndValues)
{
    Console.WriteLine("Name: {0}", pair.Name);
    Console.WriteLine("Value: {0}", pair.Value);
}

您可以使用GetProperties方法獲取類型的所有屬性。 然后,您可以使用LINQ Where擴展方法篩選此列表。 最后,您可以使用LINQ Select擴展方法或ToDictionary等方便的快捷方式來ToDictionary

如果要將枚舉限制為具有String類型的屬性,可以使用以下代碼:

IDictionary<String, String> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead && p.PropertyType == typeof(String))
  .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));

這將創建一個將屬性名稱映射到屬性值的字典。 作為屬性類型被限制為String是安全的投屬性值到String和返回的類型的類型是IDictionary<String, String>

如果您想要所有屬性,您可以這樣做:

IDictionary<String, Object> dictionary = myObject.GetType()
  .GetProperties()
  .Where(p => p.CanRead)
  .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));

如果您的目標只是使用人類可讀的格式輸出存儲在對象屬性中的數據,我更喜歡將對象序列化為JSON格式。

using System.Web.Script.Serialization;
//...

string output = new JavaScriptSerializer().Serialize(myObject);

你可以使用反射來做到這一點...... CodeGuru上有一篇不錯的文章,但這可能比你正在尋找的更多...你可以從中學習,然后根據你的需要進行修剪。

這樣的事怎么樣?

public string Prop1
{
    get { return dic["Prop1"]; }
    set { dic["Prop1"] = value; }
}

public string Prop2
{
    get { return dic["Prop2"]; }
    set { dic["Prop2"] = value; }
}

private Dictionary<string, string> dic = new Dictionary<string, string>();
public IEnumerable<KeyValuePair<string, string>> AllProps
{
    get { return dic.GetEnumerator(); }
}

暫無
暫無

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

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