How can I tell if my generic type supports a certain interface and convert back and forthto that interface for a function?
本问题已经有最佳答案,请猛点这里访问。
我有一个方法看起来像这样:
1 2 3 4 5 | private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnumerable<T> items = query<T>(); return items; } |
如果"t"支持某个接口,我现在就需要筛选这个items集合(可能不是这样,所以我不能简单地将它添加为t的约束)。所以我想要这样的东西:
1 2 3 4 5 6 7 8 9 10 | private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnumerable<T> items = query<T>(); if (typeOf(T).GetInterface(ITeamFilterable) != null) { items = FilterByTeams(items); } return items; } |
号
检查我的泛型类型是否支持某个接口**的建议方法是什么,如果支持,那么
注意:filterbyteams接受一个:
1 | IEnumerable<ITeamFilterable> |
然后返回
1 | IEnumerable<ITeamFilterable> |
。
是否需要对集合进行两次强制转换(一次转换为接口列表,然后再次转换回T列表?)
在这种情况下,恐怕您不能使用
您可以使用这样的反射:
1 2 3 4 5 6 7 8 9 |
但是,如果可以枚举查询,则可以这样做以避免反射(假设没有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnumerable<T> items = query<T>(); ICollection<T> itemsCollection = items as ICollection<T> ?? items.ToList(); if (itemsCollection.Count > 0) { var firstItem = itemsCollection.First(); if (firstItem is ITeamFilterable) return (IEnumerable<T>)(object)FilterByTeams(itemsCollection.Cast<ITeamFilterable>()); } return itemsCollection; } |
号
由于