Это не имеет ничего общего с модулем динамического запроса Linq. Эта единица предназначена для случаев, когда у вас есть фактические поля / свойства, и их имена будут предоставлены вам во время выполнения. Другими словами, у вас есть такой класс:
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
И вы хотите написать запрос:
var sortedPeople = people.OrderBy("FirstName");
Вы пытаетесь сделать полную противоположность этому - у вас есть класс, который не имеет никаких реальных свойств, просто словарь атрибутов, и вы хотите безопасность во время компиляции. Вы не можете иметь это; нет никакого способа гарантировать, что элемент будет в словаре, , особенно , когда словарь общедоступен, и любой может добавить / удалить его прямо из него!
Если есть какая-то причина, по которой вы должны использовать этот конкретный дизайн класса, тогда вы могли бы написать некоторые обертки, как представил Ник, но я бы даже не стал беспокоиться - на самом деле они не обеспечивают инкапсуляцию потому что словарь 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
, если Data
не было назначено, или KeyNotFoundException
, если даже один Item
экземпляр не имеет этого свойства. Использование метода GetValue
здесь будет успешным, несмотря ни на что:
var myItems = items.OrderBy(i => i.GetValue(ItemKeys.Name));
Если вы обнаружите, что пишете много повторяющегося кода для одних и тех же атрибутов, , тогда начните беспокоиться о добавлении в класс свойств быстрого доступа или методов расширения.