You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构造函数参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:19