Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通用可更换过滤器_.net_Generics_Filter - Fatal编程技术网

.net 通用可更换过滤器

.net 通用可更换过滤器,.net,generics,filter,.net,Generics,Filter,我正在尝试重构当前的过滤解决方案。 我有三门课: class A : C { } class B : C { } class C { } 还有一种方法可以接受泛型参数: private static IQueryable<T> ApplyFilter<T>(IQueryable query, Filter filter) { IQueryable<C> qq = query.Cast<C>(); if(q == null)

我正在尝试重构当前的过滤解决方案。 我有三门课:

class A : C { }
class B : C { }
class C { }
还有一种方法可以接受泛型参数:

private static IQueryable<T> ApplyFilter<T>(IQueryable query, Filter filter)
{
    IQueryable<C> qq = query.Cast<C>();
    if(q == null)
        throw new Exception("can not cast");
    // applying filter
    return (IQueryable<T>) q; 
}
private静态IQueryable ApplyFilter(IQueryable查询,过滤器过滤器)
{
IQueryable qq=query.Cast();
if(q==null)
抛出新异常(“无法强制转换”);
//应用过滤器
返回(IQueryable)q;
}
最后一行(返回)引发异常:“无法将类型为'System.Data.Entity.Infrastructure.DbQuery
1[C]'的对象强制转换为类型为'System.Linq.IQueryable
1[A]”

有人知道怎么修吗?
提前感谢

我通过添加一个接口D使其工作。最终解决方案如下所示:

private static IQueryable<T> ApplyFilter<T>(IQueryable query, Filter filter)
    where T: class, DInterface
{
    // can access C class props
    return query; 
}
private静态IQueryable ApplyFilter(IQueryable查询,过滤器过滤器)
其中T:类,DInterface
{
//可以访问C类道具吗
返回查询;
}

您是否尝试过使用
IQueryable qq=Query.Cast()而不是硬编码到
C
?注意:虽然
IQueryable
可以分配给
IQueryable
(通过方差),但是
IQueryable
不能分配给
IQueryable
(除非基础类型真正是一个),我没有尝试将其强制转换为t,因为它已经是t类型。“可以将IQueryable分配给IQueryable”,是否有其他方法可以在不使用此强制转换的情况下进行过滤?我读过关于表达式的文章,它可能会有帮助,但它需要更多的时间来实现;它是非通用API。你在这里干什么还不是很清楚。您有调用方的示例吗?它是通过此方法调用的:
private static IQueryable ProcessA(IQueryable query,…){query=ApplyFilter(query,filter.SubFilter);}