クラスが Summary オブジェクトの List<> を保持する設計があり、各 Summary は半動的プロパティのディクショナリです。つまり、特定のリスト内のすべてのサマリーは、ディクショナリ内で同じキーを持ちます。この設計を使用して、動的な「プロパティ」のセットを構築し、プロジェクトの仕様に従って、これらの要約値を実行時に構成できるため、要約値を追跡します。
問題は、リスト内の各項目が辞書内のキーが実際のプロパティであるかのように扱われるように、このリストをフラット化するにはどうすればよいかということです。
Dictionary をリストに変換するさまざまなバリエーションを試しましたが、キーをプロパティとして扱う必要があるため、本質的に間違っているようです。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;
}