1

我正在开发一个非常动态的 Silverlight 应用程序,其中视图模型是动态模型。WCF 服务返回包含足够信息(TableName 属性和包含实体的 Dictionary[] 数组)的 Response 对象。

所以,假设我有一个实体(字典)和一些视图模型实例,它是任何类型的对象。字典的键作为属性名称,显然,该值将用于设置视图模型中的属性值。我需要将此字典中的值映射到动态视图模型的值,反之亦然。为了对这个映射有一些限制,我创建了接口来验证字典的值,所以如果值属性名在合同中定义,我只获取/设置值。

我知道鸭子类型、动态代理、对象映射器,并且知道如何使用反射。

我开始寻找一些可以使这项任务变得简单的工具或框架。所以我找到了Impromptu-Interface。我正在尝试使用 Impromptu-interface 来做到这一点:

  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;
}

问题是:有没有更好的方法来做到这一点?

4

1 回答 1

0

You should be able to just use LINQs ToDictionary method instead of the foreach. For a collection, it just takes a lambda that shows it how to get a key.

于 2013-01-31T15:48:39.897 回答