我有一個設計,其中的類包含摘要對象的List <>,每個摘要是一個字典半動態屬性。也就是說,給定列表中的每個摘要在字典中都具有相同的鍵。我使用這種設計來構建一組動態的「屬性」來跟蹤彙總值,因爲根據我的項目規格,這些彙總值可以在運行時進行配置。如何將List <Dictionary <string,object >>轉換爲List <[具有動態屬性的新類]>
現在的問題是:如何平展此列表,以便列表中的每個項都被視爲 - 如果字典中的鍵是實際屬性?
我試過不同的變化將字典轉換爲列表,但這似乎天生錯誤,因爲我真的需要把鍵作爲屬性。我猜我需要使用C#4.0+和ExpandoObject的新動態特性,但我不太清楚。
下面的代碼顯示了基本設置,「flattenedSummary」給了我想要的 - 一個動態類型的新列表,其屬性是摘要字典的鍵。但是,這是有缺陷的,因爲我對屬性名稱進行了硬編碼,並且我無法這樣做,因爲直到運行時我纔會真正知道它們。
FlattenedSummary2版本試圖扁平化列表,但由於返回的類型仍然是列表而不是我想要的列表,所以變得不足。
public class Summary : Dictionary<string, object>
{
}
public class ClassA
{
public List<Summary> Summaries = new List<Summary>();
}
static void Main(string[] args)
{
ClassA a = new ClassA();
var summary = new Summary();
summary.Add("Year", 2010);
summary.Add("Income", 1000m);
summary.Add("Expenses", 500m);
a.Summaries.Add(summary);
summary = new Summary();
summary.Add("Year", 2011);
summary.Add("Income", 2000m);
summary.Add("Expenses", 700m);
a.Summaries.Add(summary);
summary = new Summary();
summary.Add("Year", 2012);
summary.Add("Income", 1000m);
summary.Add("Expenses", 800m);
a.Summaries.Add(summary);
var flattenedSummary = from s in a.Summaries select new { Year = s["Year"], Income = s["Income"], Expenses = s["Expenses"] };
ObjectDumper.Write(flattenedSummary, 1);
var flattenedSummary2 = Convert(a);
ObjectDumper.Write(flattenedSummary2, 1);
Console.ReadKey();
}
public static List<ExpandoObject> Convert(ClassA a)
{
var list = new List<ExpandoObject>();
foreach (Summary summary in a.Summaries)
{
IDictionary<string, object> fields = new ExpandoObject();
foreach (var field in summary)
{
fields.Add(field.Key.ToString(), field.Value);
}
dynamic s = fields;
list.Add(s);
}
return list;
}
那麼如果你直到運行時纔會知道它們是什麼,那麼你如何設想在代碼中使用這些屬性?這僅僅是爲了數據綁定還是你從未真正直接使用這些屬性的東西? – jmcilhinney 2014-09-25 02:50:53
使用此扁平化視圖的兩種方法:數據綁定到網格以進行調試,並從web api序列化爲json(或xml)。請參閱下面關於接受的答案的評論,以獲得json解決方案的細微變化。 – 2014-09-25 06:22:52