我喜欢使用属性包对象(DTO)定义服务器接口的方法,但我不喜欢编写这样的代码:
void ModifyDataSomeWay(WibbleDTO wibbleDTO)
{
WibbleBOWithMethods wibbleBO = new WibbleBOWithMethods();
wibbleBO.Val1 = wibbleDTO.Val1;
wibbleBO.Val2 = wibbleDTO.Val2;
}
这种复制代码很难编写。如果复制代码是不可避免的,那么你把它放在哪里?在BO?在工厂?如果可以手动避免写锅炉板代码那么怎么办?
提前致谢。
答案 0 :(得分:4)
这看起来像AutoMapper的工作,或者(更简单)只添加一些接口。
答案 1 :(得分:1)
这需要更多的错误处理,您可能需要修改它以适应数据类型不匹配的属性,但这显示了简单解决方案的本质。
public void CopyTo(object source, object destination)
{
var sourceProperties = source.GetType().GetProperties()
.Where(p => p.CanRead);
var destinationProperties = destination.GetType()
.GetProperties().Where(p => p.CanWrite);
foreach (var property in sourceProperties)
{
var targets = (from d in destinationProperties
where d.Name == property.Name
select d).ToList();
if (targets.Count == 0)
continue;
var activeProperty = targets[0];
object value = property.GetValue(source, null);
activeProperty.SetValue(destination, value, null);
}
}
答案 2 :(得分:1)
Automapper(或类似工具)可能是这里的前进方向。另一种方法可能是工厂模式。
最简单的就是这样:
class WibbleBO
{
public static WibbleBO FromData(WibbleDTO data)
{
return new WibbleBO
{
Val1 = data.Val1,
Val2 = data.Val2,
Val3 = ... // and so on..
};
}
}