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

如何实现支持Lambda属性赋值的C#通用泛型建造者类

泛型通用ModelBuilder实现

完全可以实现你要的效果,不需要为每个简单属性单独编写赋值方法,核心实现思路是用Action<T>委托接收属性赋值的Lambda表达式,直接在持有模型实例上执行赋值逻辑即可,复杂处理逻辑可以通过分部类单独扩展。


通用泛型基类代码

public class ModelBuilder<T> where T : class
{
    // 声明为protected,方便特定模型的扩展类访问内部实例
    protected T _modelInstance;

    /// <summary>
    /// 初始化待构建的模型实例
    /// </summary>
    /// <param name="initializedModel">传入完成基础构造的模型实例,兼容带必填构造参数的模型</param>
    public ModelBuilder<T> CreateNew(T initializedModel)
    {
        _modelInstance = initializedModel ?? throw new ArgumentNullException(nameof(initializedModel));
        return this;
    }

    /// <summary>
    /// 通用属性赋值方法,直接接收Lambda表达式执行属性设置
    /// </summary>
    /// <param name="setter">属性赋值表达式,例:x => x.Name = "张三"</param>
    public ModelBuilder<T> WithProperty(Action<T> setter)
    {
        if (setter == null) throw new ArgumentNullException(nameof(setter));
        setter(_modelInstance);
        return this;
    }

    /// <summary>
    /// 返回构建完成的模型实例
    /// </summary>
    public T Build()
    {
        return _modelInstance;
    }
}

复杂逻辑扩展方式

对于WithComplexLogic这类包含自定义处理逻辑的方法,不需要写在通用基类中,针对对应模型写分部类扩展即可,以你的Model类为例:

// Model类专属的建造者扩展
public partial class ModelBuilder<Model>
{
    public ModelBuilder<Model> WithComplexLogic(int processData)
    {
        _modelInstance.ProcesData(processData);
        return this;
    }
}

调用示例

完全匹配你预期的使用写法,同时支持链式调用:

var model = new ModelBuilder<Model>()
    .CreateNew(new Model(id: 1)) // 传入构造好的初始实例,适配带参数的模型构造函数
    .WithProperty(x => x.Name = "Name")
    .WithProperty(x => x.Age = 30)
    .WithComplexLogic(42)
    .Build();

方案优势

  • 无反射开销,性能和你原来手写专属赋值方法完全一致
  • 通用逻辑复用,所有模型都可以直接用这个泛型基类,简单属性不需要重复写WithXxx方法
  • 兼容性强,不管是简单值类型属性还是复杂引用类型属性,都可以通过WithProperty直接赋值
  • 扩展灵活,特殊业务逻辑可以针对具体模型单独扩展,不影响通用逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:36:19