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

如何实现泛型方法向不同类型IEnumerable集合添加元素?

你的思路存在问题,该需求本身可以实现,你当前的代码存在两处核心错误:

  1. IEnumerable<T> 是只读枚举接口,你调用的Append是LINQ扩展方法,不会修改原集合,只会返回一个包含新元素的新IEnumerable<T>实例,你没有接收返回值做赋值,相当于新增操作完全不生效。
  2. 泛型方法中直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:48:01