Каков наилучший способ отображения из / в словарь со свойствами объектов на основе интерфейса в качестве контракта?

Я работаю над очень динамичным приложением 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. Для коллекции просто требуется лямбда, показывающая, как получить ключ.

Другие вопросы по тегам