首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于接口的对象属性作为契约从字典映射到字典的最佳方式是什么?

使用基于接口的对象属性作为契约从字典映射到字典的最佳方式是什么?
EN

Stack Overflow用户
提问于 2013-01-31 23:35:53
回答 1查看 688关注 0票数 1

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

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

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

我开始寻找一些工具或框架,可以让这项任务变得容易。所以我找到了Impromptu-Interface。我试着用即兴接口来实现这个功能:

代码语言:javascript
复制
  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>();
}

就像一种护身符。

和反向映射:

代码语言:javascript
复制
  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;
}

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

EN

回答 1

Stack Overflow用户

发布于 2013-01-31 23:48:40

您应该能够只使用LINQ的ToDictionary方法,而不是foreach。对于一个集合,它只需要一个lambda来向它展示如何获得一个键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14629397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档