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#简化并概括了我的对象克隆方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)