如何实现泛型方法向不同类型IEnumerable集合添加元素?
你的思路存在问题,该需求本身可以实现,你当前的代码存在两处核心错误:
IEnumerable<T>是只读枚举接口,你调用的Append是LINQ扩展方法,不会修改原集合,只会返回一个包含新元素的新IEnumerable<T>实例,你没有接收返回值做赋值,相当于新增操作完全不生效。- 泛型方法中直接用
typeof(T) == typeof(某类型)的判断逻辑兼容性差,如果存在子类继承Foo/Bar的场景,类型匹配会直接失效。
推荐实现方案
首先建议把集合属性的类型替换为支持新增操作的List<T>,如果必须对外暴露只读特性,可以把公开属性改为IReadOnlyList<T>类型:
public IReadOnlyList<Foo> Foos => _foos.AsReadOnly(); public IReadOnlyList<Bar> Bars => _bars.AsReadOnly(); private readonly List<Foo> _foos = new(); private readonly List<Bar> _bars = new();
方案1:保留泛型Add方法(适合需要统一泛型调用的场景)
用模式匹配优化类型判断,兼容子类场景:
public void Add<T>(T item) { if (item is Foo foo) { _foos.Add(foo); return; } if (item is Bar bar) { _bars.Add(bar); return; } throw new ArgumentException($"不支持添加{typeof(T).Name}类型的元素", nameof(item)); }
方案2:用方法重载实现(更简单高效,无类型判断开销)
如果没有强制的泛型调用要求,直接写两个重载方法是最优解:
public void Add(Foo item) => _foos.Add(item); public void Add(Bar item) => _bars.Add(item);
内容的提问来源于stack exchange,提问作者Marco Filho
相关产品推荐
相关产品推荐

