如何在未知类型时对泛型元素执行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
相关产品推荐
相关产品推荐

