Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象属性映射到以接口为契约的字典的最佳方式是什么?_C#_Silverlight_Automapper_System.reflection_Impromptu Interface - Fatal编程技术网

C# 将对象属性映射到以接口为契约的字典的最佳方式是什么?

C# 将对象属性映射到以接口为契约的字典的最佳方式是什么?,c#,silverlight,automapper,system.reflection,impromptu-interface,C#,Silverlight,Automapper,System.reflection,Impromptu Interface,我正在开发一个非常动态的Silverlight应用程序,其中viewmodels是动态模型。 WCF服务返回包含足够信息的响应对象TableName属性和包含实体的Dictionary[]数组 所以,假设我有一个实体字典和viewmodel的某个实例,它是任何类型的对象。字典的键用作属性名称,显然,该值将用于在viewmodel中设置属性值。我需要将此字典中的值映射到DynamicViewModel的值,反之亦然。为了对这些映射有一些约束,我创建了一些接口来验证字典的值,因此只有在契约中定义了值

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

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

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

我开始寻找一些工具或框架,可以使这项任务变得容易。我找到了。我正试图通过即兴界面实现这一点:

  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 TODICTIONAL方法而不是foreach方法。对于一个集合,它只需要一个lambda来显示如何获取密钥

我认为你的文章符合你的问题,什么是从/映射到基于接口作为契约的对象属性字典的最佳方式?如果你把你的答案作为答案之一,而不是把问题改成有没有更好的方法来解决这个问题?@jbtule你好,对不起,我的英语很差。没有收到你的评论。。。无论如何,我尝试了Impromptu.InvokeSetAlltarget,但代理抛出异常。在性能测试中,是否有更好的方法将任何对象中包含的值映射到字典,并遵守接口约定?Impromptu.invokeSeall Invoke使用字典、匿名类型或命名参数进行调用。或者元组列表来描述应该设置什么,在代码中,它将像您已经做的那样循环。因此,就性能而言,这不是一种更好的方法。因为我使用的是原始动态对象,而我在设计时不知道其结构,所以不可能使用LINQ。编译时是否知道该结构,即这些强类型对象?如果是这样,您应该能够执行以下操作:var result=properties.SelectpropertyName=>new{value=Impromptu.InvokeGetproxy,propertyName,propertyName=propertyName}.ToDictionaryv=>v.propertyName;