你将如何改进这个浅复制类?
我编写了一个带有单个静态方法的类,该方法将属性值从一个对象复制到另一个对象。 它不关心每个对象是什么类型,只关心它们具有相同的属性。 它满足了我的需要,因此我不会进一步对其进行设计,但是您会做出哪些改进?
这是代码:
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);
I've written a class with a single static method that copies property values from one object to another. It doesn't care what type each object is, only that they have identical properties. It does what I need, so I'm not engineering it further, but what improvements would you make?
Here's the code:
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);
}
}
}
I'm using it as follows:
EmployeeDTO dto = GetEmployeeDTO();
Employee employee = new Employee();
ShallowCopy.Copy(dto, employee);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您的 DTO 可以序列化吗? 我希望如此,在这种情况下:
但请注意,我并不真正同意这种一般方法。 我更喜欢在每个 DTO 实施的 DTO 上进行复制的强有力的合同。
Are your DTOs serializable? I would expect so, in which case:
But note that I don't really agree with this general approach. I would prefer a strong contract for copying on your DTOs that each DTO implements.
更改类型参数名称以符合命名约定,例如 TFrom 和 TTo,或 TSource 和 TDest(或 TDestination)。
更改类型参数名称以符合命名
在泛型类型中完成大部分工作,而不仅仅是在泛型方法中。 这允许您缓存属性,并允许类型推断。 类型推断对于“TFrom”参数很重要,因为它将允许使用匿名类型。
您可以通过动态生成代码来进行属性复制并将其保存在对“from”类型有效的委托中,从而使其速度快得令人眼花缭乱。 或者可能为每个从/到对生成它,这意味着实际复制根本不需要使用反射! (准备代码将是每对类型的一次性命中,但希望您不会有太多对。)
Change your type parameter names to comply with naming conventions, e.g. TFrom and TTo, or TSource and TDest (or TDestination).
Do most of your work in a generic type instead of in just a generic method. That allows you to cache the properties, as well as allowing type inference. Type inference is important on the "TFrom" parameter, as it will allow anonymous types to be used.
You could potentially make it blindingly fast by dynamically generating code to do the property copying and keeping it in a delegate which is valid for the "from" type. Or potentially generate it for every from/to pair, which would mean the actual copying wouldn't need to use reflection at all! (Preparing the code would be a one-time hit per pair of types, but hopefully you wouldn't have too many pairs.)
创建
To
的新实例并在返回之前调用Copy()
方法的新方法可能会很有用。像这样:
A new method that created a new instance of
To
and called theCopy()
method before returning might be useful.Like this:
确定如果传递的对象类型共享某些属性但不是全部属性,您要做什么。 在尝试设置属性值之前,请检查
From
对象和To
对象中的属性是否存在。 当您来到一个不存在的房产时,做“正确的事”。 如果所有公共属性都需要相同,那么您需要检查是否已在To
对象上设置所有属性,并处理未正确设置的情况。我还建议您可能想要使用属性来装饰需要复制的属性并忽略其他属性。 这将使您能够更轻松地在两个不同的对象之间来回切换,并继续维护一些派生的公共属性,而不是存储在业务对象上的公共属性。
Decide what you want to do if passed objects of types that share some properties but not all. Check for the existence of the property in the
From
object in theTo
object before trying to set it's value. Do the "right thing" when you come to a property that doesn't exist. If all of the public properties need to be identical, then you will need to check if you've set all of them on theTo
object and handle the case where you haven't appropriately.I'd also suggest that you may want to use attributes to decorate the properties that need to be copied and ignore others. This would allow you to go back and forth between the two different objects more easily and continue to maintain some public properties that are derived rather than stored on your business object.