题
我已经写了一个类有一个静态的方法,这份财产价值从一个物体到另一个。它不在乎什么类型的每一个目的是,只有它们具有相同性质。它的确是我需要的,所以我不工程进一步,但什么样的改进,你会做什么呢?
这里的代码:
public class ShallowCopy
{
public static void Copy<From, To>(From from, To to)
where To : class
where From : class
{
Type toType = to.GetType();
foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
{
toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null);
}
}
}
我使用它如下:
EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
解决方案
是你的DTO的序列化?我希望如此,在这种情况下:
MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From));
object[] data = FormatterServices.GetObjectData(from, sm);
FormatterServices.PopulateObjectMembers(to, sm, data);
但请注意,我真的不符合这一总的做法一致。我希望能有一个强有力的合同对您的DTO复制每个DTO实现。
其他提示
改变你的类型参数名遵守命名约定的,例如TFrom和TTo,或TSource和τdest被(或TDestination).
做你的大多数工作在一般类型,而不是只是一个通用的方法。这可以让你高速缓存的性质,以及允许类型推理。类型推理是重要的"TFrom"参数,因为这将允许匿名的类型加以使用。
你可能会使其令人眼花缭乱的快速通过动态产生的代码做到的财产的复制并使其保持在一个委派其是有效的"从"类型。或潜在产生它的每一个从/向对,这将意味着实际复制不需要使用反映在所有!(准备码将是一次撞击,每对的类型,但我希望你不会有太多对。)
这创建To
的一个新实例并称为Copy()
方法之前返回可能是有用的,一个新的方法
像这样:
public static To Create<From, To>(From from)
where To : class, new()
where From : class
{
var to = new To();
Copy(from, to);
return to;
}
决定你想如果传递的共享某些属性,但不是所有类型的对象做什么。试图设置它的值之前检查在From
对象的To
对象的属性的存在。做“正确的事”,当你来到一个不存在的属性。如果所有的公共属性都需要是相同的,那么你将需要检查,如果你已经设置的所有他们的To
对象和处理,你有适当的情况并非如此。
我也建议你可能希望使用属性装饰需要被复制,而忽略其他的属性。这将允许你去来回两个不同对象之间更容易,继续保持被导出,而不是存储在您的业务对象上的一些公共属性。
不隶属于 StackOverflow