動的オブジェクト (つまりList<DynamicRow>
) を匿名型オブジェクトのリストに変換する必要がありますが、動的オブジェクトのすべてのプロパティを、実行時に linq またはその他の方法を使用して匿名型オブジェクトに作成する必要があります。
これは可能ですか?もしそうなら、どうすればいいですか?
List<String>
この動的オブジェクトは、列 ieと行 ieのリストを含むほとんどグリッド クラスList<DynamicRow>
です。
列名 ie を使用して、DynamicRow オブジェクト (Order など) に保持されている値にアクセスできるOrder[<columnName>] -> Order["OrderNumber"]
ので、Linq を使用して同じことができるようにしたいと考えています。
列のリストをループして、列名に基づいて各プロパティが設定されている行ごとに匿名オブジェクト型を作成する方法はありますか。
以下のコードが機能しないことはわかっていますが、達成しようとしていることが少し明確になるかもしれません。
これを持っている代わりに:
var itemsList = from p in customerOrderCsvReader
select new
{
Item = p.ElementAt(0).Value,
Description = p.ElementAt(1).Value,
Comment = p.ElementAt(2).Value
};
Item、Description、CommentなどのProperty名が事前にわからないので、このようなものが欲しいです。動的オブジェクトの内容を知る唯一の方法は、列名を使用することです。
var itemsList = from p in customerOrderCsvReader
select new
{
foreach string columnName in customerOrderCsvReader.columnNames
{
<columnName as property> = p.ElementAt(0).Value;
}
};
上記が実行可能であると仮定すると、別の問題は、キー、つまり p.ElementAt ではなく columnName を使用して p のプロパティにアクセスする方法があります。
更新しました
私はおそらくもっとはっきりしているはずです。これをグリッドにバインドしようとしていますが、winform だけでなく、どのプラットフォームでも機能するように、このジェネリックを保持しようとしています。
@jjchiw から提供されたコードを使用すると、これを出力ウィンドウに出力すると次のようになります。
Count = 6
[0]: {System.Dynamic.ExpandoObject}
[1]: {System.Dynamic.ExpandoObject}
[2]: {System.Dynamic.ExpandoObject}
[3]: {System.Dynamic.ExpandoObject}
[4]: {System.Dynamic.ExpandoObject}
[5]: {System.Dynamic.ExpandoObject}
しかし、linq を使用してダミーのプロパティ名をいくつか指定し、次のようなものを使用していくつかの値を割り当てた場合:
var itemsList = from p in customerOrderCsvReader
select new
{
CustomerId = p.ElementAt(0),
EmployerId = p.ElementAt(1),
Description = p.ElementAt(2)
};
出力ウィンドウに次のように出力されます。
Count = 6
[0]: { CustomerId = "GREAL", EmployerId = "6", Description = "1997-05-06T00:00:00" }
[1]: { CustomerId = "HUNGC", EmployerId = "3", Description = "1997-05-06T00:00:00" }
[2]: { CustomerId = "LAZYK", EmployerId = "8", Description = "1997-05-06T00:00:00" }
[3]: { CustomerId = "LETSS", EmployerId = "1", Description = "1997-05-04T00:00:00" }
[4]: { CustomerId = "WALLM", EmployerId = "5", Description = "1997-05-04T00:00:00" }
[5]: { CustomerId = "TOTAL", EmployerId = "4", Description = "1997-05-06T00:00:00" }
動的リストをグリッドにバインドすると、何も表示されませんが、技術的に「認識可能な」オブジェクトのリストが含まれる匿名型リストを使用すると、グリッドはそれに応じてデータを表示します。
とにかく、動的リストを匿名リストのように動作させて、動的リストをグリッドにバインドしても正しい結果が表示されるようにする方法はありますか?