C# 如何使用泛型工厂构建器创建子类实例以减少重复代码?
你遇到的转换报错本质是DualValuesBuilderHelper<T>和目标子类(例如Foo)是无继承关系的两个独立类型,仅共同实现了IDualValues<T>接口,强制跨类型转换必然触发运行时异常。
你的需求完全可以实现,不需要额外的辅助类,直接调整泛型基类的实现即可,代码非常简洁:
实现方案
1. 调整基础定义
给泛型参数添加new()约束,直接在基类的静态Create方法中构造子类实例,同时复用基类的属性定义:
public interface IDualValues<T> { T FirstValue { get; } T SecondValue { get; } } public class DualValuesBase<T, TDerived> : IDualValues<T> where TDerived : DualValuesBase<T, TDerived>, new() { public T FirstValue { get; init; } public T SecondValue { get; init; } protected DualValuesBase() { } public static TDerived Create(T firstValue, T secondValue) { return new TDerived { FirstValue = firstValue, SecondValue = secondValue }; } }
2. 子类实现
子类仅需要继承基类,不需要写任何重复的属性、构造、工厂方法代码:
public class Foo : DualValuesBase<string, Foo> { // 无需额外实现代码 } public class Bar : DualValuesBase<int, Bar> { // 无需额外实现代码 }
3. 调用方式
完全符合你要求的客户端调用规范,不需要手动new实例:
var foo = Foo.Create("测试值1", "测试值2"); var bar = Bar.Create(100, 200); Console.WriteLine(foo.FirstValue); // 输出:测试值1 Console.WriteLine(bar.SecondValue); // 输出:200
如果你需要子类支持自定义构造逻辑,也可以通过反射匹配构造参数的方式实现,上述方案已经可以覆盖绝大多数场景,没有多余的冗余代码。
内容的提问来源于stack exchange,提问作者TiGreX
相关产品推荐
相关产品推荐

