C# 将对象属性映射到以接口为契约的字典的最佳方式是什么?
我正在开发一个非常动态的Silverlight应用程序,其中viewmodels是动态模型。 WCF服务返回包含足够信息的响应对象TableName属性和包含实体的Dictionary[]数组 所以,假设我有一个实体字典和viewmodel的某个实例,它是任何类型的对象。字典的键用作属性名称,显然,该值将用于在viewmodel中设置属性值。我需要将此字典中的值映射到DynamicViewModel的值,反之亦然。为了对这些映射有一些约束,我创建了一些接口来验证字典的值,因此只有在契约中定义了值propertynames时,我才获取/设置值 我知道鸭子类型、动态代理、对象映射器,并且知道如何使用反射 我开始寻找一些工具或框架,可以使这项任务变得容易。我找到了。我正试图通过即兴界面实现这一点:C# 将对象属性映射到以接口为契约的字典的最佳方式是什么?,c#,silverlight,automapper,system.reflection,impromptu-interface,C#,Silverlight,Automapper,System.reflection,Impromptu Interface,我正在开发一个非常动态的Silverlight应用程序,其中viewmodels是动态模型。 WCF服务返回包含足够信息的响应对象TableName属性和包含实体的Dictionary[]数组 所以,假设我有一个实体字典和viewmodel的某个实例,它是任何类型的对象。字典的键用作属性名称,显然,该值将用于在viewmodel中设置属性值。我需要将此字典中的值映射到DynamicViewModel的值,反之亦然。为了对这些映射有一些约束,我创建了一些接口来验证字典的值,因此只有在契约中定义了值
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;