C#简化并概括了我的对象克隆方法

C#简化并概括了我的对象克隆方法,第1张

概述我写了一个方法: class CopyableFloatCommand : FloatCommand{ public CopyableFloatCommand DeepCopy(LocationHeaderDTO locHeader, string commandId, List<FloatProductDetailsDTO> recountProuducts) 我写了一个方法:

class copyablefloatCommand : floatCommand{    public copyablefloatCommand Deepcopy(LocationheaderDTO locheader,string commandID,List<floatProductDetailsDTO> recountProuducts)    {        var newCommand = (copyablefloatCommand)MemberwiseClone();        newCommand.Location = locheader ?? newCommand.Location;        newCommand.CommandID = commandID ?? newCommand.CommandID;        newCommand.RecountProducts = recountProuducts ?? newCommand.RecountProducts;        return newCommand;    }}

然后我通过以下方式调用它:

_tCheckinCommand = _pTCommand.Deepcopy(stagingLocheadDto,SCICommand,new List<floatProductDetailsDTO>(_pTCommand.MoveProducts));

为了深入复制floatCommand类型的对象.

由于MemberwiseClone()是一个受保护的方法,它必须按上面所述的方式调用 – 例如,无法在方法参数中的floatCommand类型中进行解析,并通过fc.MemberwiseClone()调用它.由于我的方法应该在floatCommand类型上工作,我创建了一个新的嵌套类copyablefloatCommand,它继承自floatCommand. Deepcopy方法然后浅层克隆floatCommand,强制转换为子类型并在需要时更改某些属性.

专门为此目的创建一个新类似乎有点笨拙,我当时没有看到更明显的写作方式.就代码行而言,是否有更简单的方法来采用如上所述的深度复制?如果另一个类UserCommand试图对User对象进行深度复制呢? UserComand将成为floatCommand的兄弟,因此它们都从Command继承.该方法将针对不同类型解析不同的参数(尽管我可以完全删除参数并在需要时使用实例变量),因为不同的子类型具有稍微不同的属性.

鉴于上述约束,有一种更通用的编写Deepcopy方法的方法,可供所有Command类型访问以避免某些代码重复?

谢谢!

解决方法 我认为您怀疑克隆对象并在克隆对象后修改其状态的责任应该分开 – 因为您再次面对类似的任务(我的意思是UserCommand).

在这种情况下我会做以下事情:

创建变异接口:

public interface ICopycommandMutation{  voID Mutate(Command target); }

为了可扩展性,我将创建默认的muate实现:

public class NoMutation : ICopycommandMutation{  public voID Mutate(Command target) {}}

创建copyableCommand类并在那里移动Deepcopy()方法(您还应该从copyableCommand继承floatCommand):

public copyableCommand : Command {   public copyableCommand Deepcopy(ICopycommandMutation commandMutation = null)   {      var newCommand = (copyableCommand)MemberwiseClone();      if (commandMutation == null) commandMutation = new NoMutation();      commandMutation.Mutate(newCommand);      return newCommand;   }}

现在所有的copyableCommand继承者都可以使用’mutation’进行复制 – 您只需要实现该类.例如,你问题中的floatCommand’突变’:

public class ChangeLocationRecountProducts : ICopycommandMutation{  // these fIElds should be initialized some way (constructor or getter/setters - you decIDe  LocationheaderDTO locheader;  string commandID;  List<floatProductDetailsDTO> recountProducts;  public voID Mutate(Command floatCommand)  {     var fc = floatCommand as floatCommand;     if (fc == null) { /* handle problems here */ }     fc.Location = locheader ?? fc.Location;     fc.CommandID = commandID ?? fc.CommandID;     fc.RecountProducts = recountProuducts ?? fc.RecountProducts;  }}

这是用法:

var clrp = new ChangeLocationRecountProducts();// ... setting up clrp_tCheckinCommand = _pTCommand.Deepcopy(clrp);

现在,如果你需要’改变’UserCommand – 你可以为它做单独的变异类并保持变异逻辑.能够在不同的情况下进行不同的突变(仅通过定义单独的突变类)是免费的.
我能在这里看到的唯一问题是你可能无法创建copyableCommand并从中继承其他命令(第三方库?).解决方案是使用Castle动态代理.

我没有使用automapper,但我怀疑它正在做类似的事情.

解决方案不是“代码行最优” – 但如果在复制实例时必须改变大量命令类,则可以从中受益.

总结

以上是内存溢出为你收集整理的C#简化概括了我的对象克隆方法全部内容,希望文章能够帮你解决C#简化并概括了我的对象克隆方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1232558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存