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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:06:03