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

如何为C#泛型类NameMap<T1,T2>实现带预设值的初始化方法

C# 泛型双向映射类初始化方案

以下两种实现方案既可以保留泛型类的通用性,也能满足特定场景下的初始化需求,优于你提到的两种思路:

方案1:泛型类新增支持初始化集合的构造函数

该方案不改变原有泛型类的适用范围,所有T1/T2类型的NameMap实例都支持传入初始映射值,灵活度最高:

public class NameMap<T1, T2>
{
    private Dictionary<T1, T2> _forward = new Dictionary<T1, T2>();
    private Dictionary<T2, T1> _backward = new Dictionary<T2, T1>();

    // 保留无参构造函数,兼容原有实例化逻辑
    public NameMap() { }

    // 新增带初始化映射的构造函数
    public NameMap(IEnumerable<KeyValuePair<T1, T2>> initialMappings)
    {
        foreach (var mapping in initialMappings)
        {
            addBidirectional(mapping.Key, mapping.Value);
        }
    }

    public void addBidirectional(T1 modelName, T2 businessName)
    {
        _forward.Add(modelName, businessName);
        _backward.Add(businessName, modelName);
    }

    // 其他原有逻辑保持不变
}

使用方式示例(字符串类型场景):

// 实例化时直接写入需要的初始蓝红映射
var colorNameMap = new NameMap<string, string>(new Dictionary<string, string>
{
    {"Blue", "red"}
});

方案2:派生特定类型的子类封装固定初始化逻辑

如果你有固定类型、固定初始映射的高频使用场景,可以继承泛型基类实现专属子类,不会影响基类的泛型通用能力:

// 专门用于字符串类型颜色名称映射的子类
public class ColorNameMap : NameMap<string, string>
{
    public ColorNameMap()
    {
        // 在这里硬编码固定的初始映射,不会和泛型参数冲突
        addBidirectional("Blue", "red");
        // 可扩展其他固定初始映射
    }
}

使用方式示例:

var colorMap = new ColorNameMap();

原有思路的局限性说明

  • 思路1需要传入已实例化的NameMap<string,string>,本质是把初始化逻辑移到类外,复用性差
  • 思路2直接限制泛型参数为字符串,会彻底丢失泛型类的通用能力,无法支持后续其他类型的双向映射需求(比如int和枚举的映射)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:03