私の理解が正しければ、コードで定義する必要はないが、厳密に型指定された方法で使用できるオブジェクトのコレクションを取得したいと考えています。残念ながら、できません。
匿名型は、ある種のバリアントまたは動的オブジェクトのように見えますが、実際には、コンパイル時に定義される厳密に型指定されたクラスです。.NET は、バックグラウンドで自動的に型を定義します。.net がこれを実行できるようにするには、型定義を推測するコードから手がかりを得る必要があります。次のようなものが必要です。
from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email")
そのため、どのメンバーを定義するかがわかります。それを回避する方法はありません。匿名型を定義するには、情報が論理的に存在する必要があります。
正確にこれを行おうとしている理由に応じて、いくつかのオプションがあります。
- データ アクセスをカプセル化しながらインテリセンスが必要な場合は、カプセル化されたデータ アクセス クラスからデータ テーブルの代わりに xml を返すことができます。(データ テーブルは非常に簡単に xml に変換できます。XElementのような新しいSystem.Xml.Linqクラスを使用することをお勧めします。これは素晴らしい機能です!) 次に、VS2008 の機能を使用して、xml から xsd スキーマを作成できます。次に、コード ページの上部でそのスキーマを使用/インポートすると、インテリセンスが得られます。
- データのプロパティを持つオブジェクトが必要であるが、それらのクラス/構造を定義したくない場合は、C#4.0/VB10 で登場する新しい動的オブジェクトが気に入るはずです。SQL が返すものに基づいたオブジェクト プロパティがありますが、インテリセンスはありません。これにはパフォーマンス コストもありますが、(a) 状況によっては問題にならない可能性があり、(b) 状況によっては実際にはそれほど悪くはありません。
- 多くのクラスを作成することを避けたい場合は、同じコード ファイルでクラス定義の下に構造体/構造体を定義することを検討してください。結果セットにさらに列を追加すると、より多くのパブリック フィールドを持つ構造体を簡単に調整できます。
つまり、(a) 動的、(b) 厳密に型指定されたオブジェクト、(3) インテリセンスの 3つのうち任意の 2 つを使用できます。しかし、3つすべてではありません。