如何为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
相关产品推荐
相关产品推荐

