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

如何在未知类型时对泛型元素执行foreach遍历?

解决泛型Service类集合遍历筛选问题

这里有几个简洁的方案,无需依赖typeof就能筛选并处理泛型Service<TInterface, TEntity>实例:

方案1:引入非泛型标记接口/基类

给泛型Service类添加一个非泛型的父接口,用来统一标记所有Service实例:

// 定义非泛型标记接口
public interface IService : IAppFeatureBase { }

// 让泛型Service实现这个接口
public class Service<TInterface, TEntity> : AppFeatureBase, IAppFeatureBase, IService
{
    // 你的类实现代码
    public Features Feature { get; set; }
}

之后遍历集合时,直接用OfType<IService>筛选,再判断Feature类型:

foreach (var service in features.OfType<IService>().Where(s => s.Feature == Features.Service))
{
    // 在这里处理service实例,可调用IAppFeatureBase或IService的成员
}

方案2:利用C#模式匹配(推荐)

C# 7及以上支持泛型通配符的模式匹配,无需额外定义接口,直接在遍历中匹配:

foreach (var item in features)
{
    // 匹配任意类型参数的Service实例,同时检查Feature类型
    if (item is Service<,> service && service.Feature == Features.Service)
    {
        // 这里的service是泛型Service的实例,可访问基类/AppFeatureBase的成员
        // 如果需要操作具体泛型类型的成员,可后续再做类型转换
    }
}

也可以结合LINQ简化写法:

var serviceInstances = features.Where(item => item is Service<,> s && s.Feature == Features.Service)
                               .Cast<Service<,>>();

foreach (var service in serviceInstances)
{
    // 处理逻辑
}

方案3:泛型辅助方法封装

如果需要频繁做这类筛选,可以封装一个泛型扩展方法,隐藏类型判断细节:

public static class FeatureExtensions
{
    public static IEnumerable<Service<,>> GetServiceFeatures(this IAppFeatureBase[] features)
    {
        foreach (var item in features)
        {
            if (item is Service<,> service && service.Feature == Features.Service)
            {
                yield return service;
            }
        }
    }
}

使用时直接调用:

foreach (var service in features.GetServiceFeatures())
{
    // 处理逻辑
}

这些方案都保留了泛型的简洁性,避免了繁琐的typeof反射判断,可根据你的代码结构选择最适配的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:39:57