C# 我如何判断我的泛型类型是否支持某个接口,并将其转换为函数的该接口?
我有一个方法如下所示:C# 我如何判断我的泛型类型是否支持某个接口,并将其转换为函数的该接口?,c#,generics,collections,interface,C#,Generics,Collections,Interface,我有一个方法如下所示: private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnumerable<T> items = query<T>(); return items; } private IEnumerable<T> QueryCollection<T>() where T : BaseObj { IEnum
private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
IEnumerable<T> items = query<T>();
return items;
}
private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
IEnumerable<T> items = query<T>();
if (typeOf(T).GetInterface(ITeamFilterable) != null)
{
items = FilterByTeams(items);
}
return items;
}
private IEnumerable QueryCollection(),其中T:BaseObj
{
IEnumerable items=query();
退货项目;
}
现在,如果“T”支持某个接口(可能不支持,因此我不能简单地将其添加为T的约束),我就想过滤这个items集合。所以我想要这样的东西:
private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
IEnumerable<T> items = query<T>();
return items;
}
private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
IEnumerable<T> items = query<T>();
if (typeOf(T).GetInterface(ITeamFilterable) != null)
{
items = FilterByTeams(items);
}
return items;
}
private IEnumerable QueryCollection(),其中T:BaseObj
{
IEnumerable items=query();
if(typeOf(T).GetInterface(ITeamFilterable)!=null)
{
项目=过滤器字节(项目);
}
退货项目;
}
检查我的泛型类型是否支持某个接口**的建议方法是什么?如果是,则
IEnumerable<ITeamFilterable>
IEnumerable
返回
IEnumerable<ITeamFilterable>
IEnumerable
我是否需要将集合强制转换2次(一次转换为接口列表,然后再次转换回T列表?在这种情况下,除非您可以开始枚举查询,否则您不能使用
is
/as
)
您可以这样使用反射:
private IEnumerable<T> QueryCollection<T>() where T : BaseObj
{
IEnumerable<T> items = query<T>();
if (typeof(ITeamFilterable).IsAssignableFrom(typeof(T)))
items = (IEnumerable<T>)(object)FilterByTeams(items.Cast<ITeamFilterable>());
return items;
}
强制转换将起作用,因为
ITeamFilterable
是T
和IEnumerable
是协变的,但您必须强制转换到对象
,以满足泛型约束。使用这些类型转换,无需复制项目。或者只需使用is
/as
+!=空
。这不是重复的,因为链接的问题不处理协方差请参见我的问题的更新。您的答案不起作用,因为FilterByTeams不返回t的集合,而是返回ITeamFilterable的集合interface@leora答案更新了,这应该是你的答案,简言之,是的,你需要回溯,简言之,是的。但我的观点是,您不需要创建一个新的ITeamFilterable
列表,仅仅为了拥有一个ITeamFilterable
列表,强制转换就足够了,并且不会复制数据。我想我误解了你问题的这一方面。