从/映射到字典的最佳方法是什么,其中的对象属性基于接口作为协定

本文关键字:于接口 接口 属性 字典 映射 最佳 方法 是什么 对象 | 更新日期: 2023-09-27 17:56:46

我正在开发一个非常动态的Silverlight应用程序,其中视图模型是动态模型。WCF 服务返回一个包含足够信息的响应对象(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;
}

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

从/映射到字典的最佳方法是什么,其中的对象属性基于接口作为协定

您应该能够只使用 LINQs ToDictionary 方法而不是 foreach。 对于集合,它只需要一个 lambda 来显示它如何获取密钥。