.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.DbQuery1[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);}