我有一个程序可以通过多种类型的类的查询条件,EF可以使用该程序从数据库中查询回数据。对于每种要查询的类型都有一个标准类,但是这些方法之间有很多重复和相似之处,我希望这些方法能够进行重构,但是没有成功。
这些是示例(简化)服务方法:
private static IQueryable<Class1> FilterClass1ResultsOnId(Class1QueryCriteria queryCriteria, IQueryable<Class1> queryResults)
{
if (!string.IsNullOrEmpty(queryCriteria.Id))
{
queryResults = from view in queryResults where view.Id==queryCriteria.Id select view;
}
return queryResults;
}
private static IQueryable<Class2> FilterClass2ResultsOnId(Class2QueryCriteria queryCriteria, IQueryable<Class2> queryResults)
{
if (!string.IsNullOrEmpty(queryCriteria.Id))
{
queryResults = from view in queryResults where view.Id == queryCriteria.Id select view;
}
return queryResults;
}
像这样的...
queryResults = FilterClass1ResultsOnId(queryCriteria, queryResults);
该服务具有一系列“ FilterClassXonSOMECRITERIA”方法,以缩小最终返回的IQueryable的范围。这些服务方法很多,除了输入参数的类型和输出的类型外,它们基本上是相同的。
最初,我尝试重构方法以接受queryResults
作为接口而不是具体类的参数(仅具有Id
属性的简单接口),然后制作Class1
并Class2
实现该接口。但是,如果我只想使用一种方法,那么我也需要使这些方法的返回类型也不具体。这就是我卡住的地方。
我一直在四处寻找,并看到协方差和逆变的信息,但我似乎无法定义一个方法/接口,使用这些接口和通用型没有得到“无法解析符号T”或“参数类型XXX是不能分配给参数类型YYY''。
在这一点上,我想与更熟悉此问题的人员进行理智检查:我试图做的事情有可能吗?我是否可以使用仅由接口指定的参数的方法,并从该方法返回也仅由接口指定的对象的方法?
编辑:条件类非常简单,实际上是EF模型中定义的复杂类型。但是,这是一个简化的示例:
public class Class1QueryCriteria
{
public string Id;
public string Name;
}
public class Class2QueryCriteria
{
public string Id;
public string Category;
}
您应该能够为条件定义一个接口:
interface IQueryCriteria {
string Id { get; set; }
}
..,如有必要,还可以输入“视图”的界面类型:
interface IViewType {
string Id { get; set; }
}
然后,您的方法(非复数)可以是通用的:
private static IQueryable<T> FilterClassResultsOnId<T>(IQueryCriteria queryCriteria, IQueryable<T> queryResults)
where T : IViewType
{
if (!string.IsNullOrEmpty(queryCriteria.Id))
{
queryResults = from view in queryResults where view.Id == queryCriteria.Id select view;
}
return queryResults;
}
这里的关键是泛型类型约束where T : IViewType
。这允许在view.Id
方法的主体中使用,因为编译器可以确认类型将至少实现带有Id
属性的接口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句