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

C#重构含大量可选参数类 如何仅指定需赋值参数无需传空值

可行实现方案整理

方案1:直接使用命名参数调用(无需修改现有类)

C#原生支持命名参数调用,不需要调整现有DocumentParameters类的代码,调用时直接指定参数名即可跳过不需要赋值的可选参数,其余未指定的可选参数会自动使用默认值null。
代码示例:

// 构造函数原有定义示例:
// public DocumentParameters(string required1, int required2, [Optional] string parameter1, [Optional] int? parameter2, ... [Optional] DateTime? parameter16, ...)

// 调用时仅指定需要赋值的参数
var param = new DocumentParameters(
    required1: "必填参数1的值",
    required2: 100,
    parameter1: "参数1的值",
    parameter2: 200,
    parameter16: new DateTime(2024,1,1)
);

该方案改动成本为0,适合不想调整现有类结构的场景。

方案2:使用init属性+对象初始化器(推荐,C# 9及以上版本)

完全重写DocumentParameters类,将必填参数放在构造函数中强制传入,其余可选参数声明为可空的init只读属性,调用时通过对象初始化器按需赋值,未赋值的引用类型/可空值类型属性默认就是null。
代码示例:

public class DocumentParameters
{
    // 必填参数
    public string RequiredParam1 { get; }
    public int RequiredParam2 { get; }

    // 可选参数
    public string? Parameter1 { get; init; }
    public int? Parameter2 { get; init; }
    // ... 其余27个可选参数以此类推
    public DateTime? Parameter16 { get; init; }
    // ...

    public DocumentParameters(string requiredParam1, int requiredParam2)
    {
        RequiredParam1 = requiredParam1;
        RequiredParam2 = requiredParam2;
    }
}

// 调用示例
var param = new DocumentParameters("必填1的值", 200)
{
    Parameter1 = "参数1的值",
    Parameter2 = 300,
    Parameter16 = new DateTime(2024,1,1)
};

该方案代码简洁,可读性高,属性初始化后不可修改,适合测试用例的稳定传参需求。

方案3:建造者模式(适合复杂测试场景)

如果测试用例有大量复用的参数组合,可以引入建造者模式,链式调用的写法可读性更强,还可以预置常用参数模板。
代码示例:

public class DocumentParameters
{
    // 必填参数
    public string RequiredParam1 { get; }
    public int RequiredParam2 { get; }
    // 可选参数
    public string? Parameter1 { get; set; }
    public int? Parameter2 { get; set; }
    public DateTime? Parameter16 { get; set; }
    // ... 其余参数

    // 构造函数设为internal,仅允许Builder创建实例
    internal DocumentParameters(string required1, int required2)
    {
        RequiredParam1 = required1;
        RequiredParam2 = required2;
    }

    // 嵌套建造者类
    public class Builder
    {
        private readonly DocumentParameters _instance;

        public Builder(string required1, int required2)
        {
            _instance = new DocumentParameters(required1, required2);
        }

        public Builder WithParameter1(string val)
        {
            _instance.Parameter1 = val;
            return this;
        }

        public Builder WithParameter2(int? val)
        {
            _instance.Parameter2 = val;
            return this;
        }

        public Builder WithParameter16(DateTime? val)
        {
            _instance.Parameter16 = val;
            return this;
        }

        // 预置常用模板方法示例
        public Builder WithDefaultPersonalInfo()
        {
            _instance.Parameter1 = "默认姓名";
            _instance.Parameter2 = 18;
            return this;
        }

        public DocumentParameters Build() => _instance;
    }
}

// 调用示例
var param = new DocumentParameters.Builder("必填1", 200)
    .WithParameter1("自定义值")
    .WithParameter16(new DateTime(2024,1,1))
    .Build();

该方案扩展性最强,适合参数组合复杂、复用度高的测试场景。

内容的提问来源于stack exchange,提问作者SomebodyWithAQuestion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:09:03