C#如何将实现多泛型参数接口的不同派生类存入同一个List集合
实现方案
你遇到的问题本质是C#中不同闭合构造的泛型类型不存在隐式转换关系,无法作为同一种元素类型存入泛型List,下面是可行的实现方案:
方案1:新增非泛型基接口(最推荐)
通过标记接口或者带公共方法的非泛型接口作为所有泛型实现的父类型,即可用该类型作为List的元素类型。
步骤1:定义非泛型基接口
// 可按需添加不需要泛型参数的公共方法到该接口 public interface IWidgetHandler { // 示例:如果有通用初始化方法可以直接在这里声明 // public void Init(); }
步骤2:修改原有泛型接口继承该基接口
// 可根据需求添加协变逆变标记out/in,方便后续类型转换 public interface IWidgetHandler<T1, T2, T3> : IWidgetHandler { protected T1 Config { get; set; } protected T1 ParseConfig(); public T2 GetConfigResponse(); public T3 ProcessRequest(T2 r); }
步骤3:声明List并使用
// 元素类型用非泛型基接口 List<IWidgetHandler> widgetList = new List<IWidgetHandler>(); // 可以直接添加所有派生类实例 widgetList.Add(new SomeWidget()); widgetList.Add(new SomeOtherWidget());
调用方法时的处理
如果需要调用泛型接口的方法,用模式匹配或者dynamic转型即可:
// 模式匹配写法(类型安全,推荐) foreach (var widget in widgetList) { if (widget is SomeWidget someWidget) { var resp = someWidget.GetConfigResponse(); someWidget.ProcessRequest(resp); } else if (widget is SomeOtherWidget otherWidget) { var resp = otherWidget.GetConfigResponse(); otherWidget.ProcessRequest(resp); } } // dynamic写法(灵活但要注意运行时类型正确性) foreach (dynamic widget in widgetList) { var resp = widget.GetConfigResponse(); widget.ProcessRequest(resp); }
方案2:直接用List
相关产品推荐
相关产品推荐

