如何实现支持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
相关产品推荐
相关产品推荐

