這並不一定與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");
你正在嘗試做的這的完全相反 - 你有一個沒有任何實際屬性的類,只是一個屬性字典,並且你希望編譯時安全。你不能擁有它;如果字典是公開的並且任何人都可以直接添加/刪除,則無法保證該字典中將包含該項目,尤其是!
如果有,你必須使用特定一流的設計,那麼你就可以想見,寫一些包裝尼克已經提出了一些原因,但我不會甚至不屑 - 他們實際上並沒有提供任何封裝,因爲Data
字典仍然向全世界開放。相反,我只是提供一個單獨的getter方法或索引器屬性,並使用您期望在其中的屬性名稱創建一些常量(或枚舉)。
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
如果Data
尚未分配的風險,或KeyNotFoundException
如果甚至一個Item
實例沒有該屬性。使用GetValue
方法在這裏一定會成功不管是什麼:
var myItems = items.OrderBy(i => i.GetValue(ItemKeys.Name));
如果你發現你寫了很多重複的代碼相同的屬性,然後開始擔心添加快捷方式的屬性或擴展方法的類。
嗯...一個擴展類可能有幫助...這個想法是你隱藏真正的實現並提供一個更簡單的代理。名稱必須是知道數據的類。 – 2010-03-28 14:24:31