构造函数参数cParams被内部类修改,多实例状态异常问题
问题原因
因为cParams是引用类型,你传给customer和company的是同一个对象的引用。company构造函数里修改cParams.schema,本质是修改了那个唯一的cParams实例,所以_adapter用的也是被修改后的对象,自然会受影响。
解决办法
给你三种可行的方案,选适合你项目的就行:
方案1:在创建company前复制cParams副本
修改APiInboundBLL的构造函数,给company传一个独立的cParams实例:
public APiInboundBLL(cParams cParams) { _cParams = cParams; _adapter = new customer(_cParams); // 创建cParams的副本,把原属性值都复制过去 var companyParams = new cParams(); companyParams.schema = cParams.schema; // 其他属性也要逐个复制,比如companyParams.Id = cParams.Id; _adapterCompany = new company(companyParams); }
方案2:给cParams实现克隆接口
如果cParams需要频繁复制,直接实现ICloneable接口更方便:
首先修改cParams类:
public class cParams : ICloneable { public string schema { get; set; } // 你的其他属性... // 浅克隆,要是有嵌套的引用类型属性,得改成深克隆 public object Clone() { return this.MemberwiseClone(); } }
然后在APiInboundBLL里用克隆:
public APiInboundBLL(cParams cParams) { _cParams = cParams; _adapter = new customer(_cParams); _adapterCompany = new company((cParams)cParams.Clone()); }
方案3:让company内部使用自己的cParams副本
修改company的构造函数,不要直接修改传入的参数,而是内部创建副本:
public class company { private cParams _internalParams; public company(cParams cParams) { // 创建自己的参数实例,只修改内部的 _internalParams = new cParams(); // 先复制原参数的所有属性 _internalParams.schema = "client"; _internalParams.OtherProp = cParams.OtherProp; // 其他属性同理复制 } }
内容的提问来源于stack exchange,提问作者Emperor
相关产品推荐
相关产品推荐

