我正在开发一个非常动态的Silverlight应用程序,其中视图模型是动态模型。 WCF服务返回一个包含足够信息的Response对象(TableName属性和包含实体的Dictionary []数组。)
因此,假设我有一个实体(Dictionary)和一些viewmodel实例,它是任何类型的对象。字典的键用作属性名称,显然,该值将用于在viewmodel中设置属性值。我需要将此字典中的值映射到动态视图模型的值,反之亦然。为了对这个映射有一些约束,我创建了接口来验证字典的值,所以如果在合同中定义了values property,我只得到/设置值。
我知道鸭子打字,动态代理,对象映射器,我知道如何使用反射。
我开始寻找一些可以轻松完成此任务的工具或框架。所以我找到了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;
}
问题是:有没有更好的方法呢?
答案 0 :(得分:0)
您应该能够使用LINQs ToDictionary方法而不是foreach。对于集合,它只需要一个lambda来显示如何获取密钥。