Каков наилучший способ отображения из / в словарь со свойствами объектов на основе интерфейса в качестве контракта?
Я работаю над очень динамичным приложением Silverlight, в котором моделями представления являются динамические модели. Служба WCF возвращает объект Response, который содержит достаточно информации (свойство TableName и массив Dictionary[], содержащий сущности).
Итак, предположим, у меня есть одна сущность (словарь) и некоторый экземпляр модели представления, который является объектом любого вида. Ключ словаря служит именем свойства, и, очевидно, это значение будет использоваться для установки значения свойства в модели представления. Мне нужно отобразить значения из этого словаря в значения динамической модели представления и наоборот. Чтобы иметь некоторые ограничения для этих сопоставлений, я создал интерфейсы для проверки значений словаря, поэтому я получаю / устанавливаю значения только в том случае, если значения имен свойств определены в контракте.
Я знаю о типизации утки, динамических прокси, объектных сопоставителях, и я знаю, как использовать отражение.
Я начал искать какой-то инструмент или структуру, которая может легко справиться с этой задачей. Итак, я нашел экспромт-интерфейс. Я пытаюсь сделать это с помощью импровизированного интерфейса:
public static TContract MapFromDictionary<TContract>(object bindingModel, Dictionary<string, object> data) where TContract : class {
var proxy = new ImpromptuDictionary(data).ActLike<TContract>();
var properties = Impromptu.GetMemberNames(proxy);
foreach (var propertyName in properties) {
object value = Impromptu.InvokeGet(proxy, propertyName);
Impromptu.InvokeSet(bindingModel, propertyName, value);
}
return bindingModel.ActLike<TContract>();
}
Работает как шарм.
И обратное отображение:
public static Dictionary<string, object> MapToDictionary<TContract>(object source) where TContract : class {
var proxy = source.ActLike<TContract>();
var result = new Dictionary<string, object>();
var properties = Impromptu.GetMemberNames(proxy);
foreach (var propertyName in properties) {
object value = Impromptu.InvokeGet(proxy, propertyName);
result.Add(propertyName, value);
}
return result;
}
Вопрос в том, есть ли лучший способ сделать это?
1 ответ
Вы должны иметь возможность просто использовать метод ToDictionary LINQs вместо foreach. Для коллекции просто требуется лямбда, показывающая, как получить ключ.