バックグラウンド
私は Microsoft Dynamics CRM 2011 QueryExpressions を使用しています。これは、CRM 以外のすべての人にとって、選択している列の文字列名を入力する必要があるデータベースにアクセスするために SDK を使用していることを知っているだけです。カスタム ColumnSet クラスで:
new ColumnSet("personid", "name", "age");
SDK はアーリー バインド クラスを生成するため、すべてのデータベース テーブル用のクラスがあり、アーリー バインド クラスにはすべて、オブジェクトに取り込まれたテーブルの列をキーとするディクショナリがあります。すなわち:
var p = new Person { Name = "John", Age = 39, SSN = null };
p.Attributes.Count == 3;
// p.Attributes.Keys == { "name", "age", "ssn" };
問題
ColumnSet に入力するときに 3 つの問題があります
- クラス/テーブルに含まれる列を忘れました
- いくつかの列をファット フィンガーしても、実行時までエラーは発生しません
- ColumnSet をインスタンス化するとき、列名はすべて小文字にする必要があります
thissillyexampleisntthatreadable
。ThisSillyExampleIsntThatReadable
これら 3 つの問題はすべて、早期バインディングによって解決できます。
クラスのすべての列、つまり new ColumnSet(PersonColumns.PersonId, PersonColumns.Name, PersonColumns.Age) を含む各クラスの列挙型またはスタクトを作成できることはわかっていますが、既に生成されているクラスを使用したい.
私の最善の試み
私が現在思いつくことができる最高のものはこれです:
ColumnSetFactory.Create<Person>(p => p.PersonId = null, p.Name = null, p.Age = null);
ここで、Create は型 T (この例では person) のオブジェクトを受け取り、オブジェクトのディクショナリを調べて、ColumnSet を生成して返します。
目標
事前にバインドされたクラスを利用して ColumnSet を生成する汎用関数を用意します。
ColumnSetFactory.Create<Person>(p => p.PersonId, p.Name, p.Age);
何か案は?