これは、Linq Dynamic Query ユニットとは関係ありません。そのユニットは、実際のフィールド/プロパティがあり、それらの名前が実行時に与えられる場合のためのものです。つまり、次のようなクラスがあります。
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
そして、次のようなクエリを記述できるようにしたいと考えています。
var sortedPeople = people.OrderBy("FirstName");
これとは正反対のことをしようとしています。実際のプロパティを持たず、属性辞書だけを持つクラスがあり、コンパイル時の安全性が必要です。あなたはそれを持つことができません。特に辞書が公開されていて、誰でも辞書に直接追加/削除できる場合は、アイテムが辞書にあることを保証する方法はありません!
その特定のクラス設計を使用しなければならない何らかの理由がある場合は、Nick が提示したようにいくつかのラッパーを作成することも考えられますが、気にする必要はありませんData
。全世界。代わりに、単一の安全なゲッター メソッドまたはインデクサー プロパティを提供し、そこにあると予想されるプロパティの名前でいくつかの定数 (または列挙型) を作成します。
public class Item
{
public Dictionary<string, string> Data { get; set; }
public string GetValue(string key)
{
if (Data == null)
return null;
string result;
Data.TryGetValue(key, out result);
return result;
}
}
public class ItemKeys
{
public const string Name = "Name";
public const string Foo = "Foo";
}
等々。実際にItemKeys
はそれほど重要ではありません。安全なGetValue
方法が重要です。そうしないと、NullReferenceException
ifData
が割り当てられていないか、KeyNotFoundException
1つのItem
インスタンスでもそのプロパティがない場合にリスクが生じるためです。ここでメソッドを使用すると、GetValue
何があっても成功します。
var myItems = items.OrderBy(i => i.GetValue(ItemKeys.Name));
同じ属性に対して多くの繰り返しコードを書いていることがわかった場合は、ショートカット プロパティまたは拡張メソッドをクラスに追加することについて心配し始めます。