重构两种使用接口和/或泛型的方法

马什顿

我有一个程序可以通过多种类型的类的查询条件,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属性的简单接口),然后制作Class1Class2实现该接口。但是,如果我只想使用一种方法,那么我也需要使这些方法的返回类型也不具体。这就是我卡住的地方。

我一直在四处寻找,并看到协方差逆变的信息,但我似乎无法定义一个方法/接口,使用这些接口和通用型没有得到“无法解析符号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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重构两种使用接口和/或泛型的方法

来自分类Dev

接口,泛型和重构

来自分类Dev

接口,泛型和重构

来自分类Dev

重构方法使用泛型

来自分类Dev

如何将两种泛型类型传递给扩展方法

来自分类Dev

使用 indexOf 重构两种方法

来自分类Dev

在 C# 中,如何使用具有两种不同类型的泛型?

来自分类Dev

符合两种协议的Swift泛型类型

来自分类Dev

在Java中使用泛型和反射实现接口方法

来自分类Dev

如何使用泛型将这两种方法合而为一?

来自分类Dev

如何在一种方法中重构两种相似的方法

来自分类Dev

Java两种方法之间的区别(泛型)

来自分类Dev

如何使用泛型和外部类重构辅助方法?(Java Android)

来自分类Dev

如何重构代码,所以是两种Web表单的一种方法

来自分类Dev

如何将此代码从两种方法重构为一种方法

来自分类Dev

如何使用Restful Web服务对两种不同的操作使用两种Web方法?

来自分类Dev

为什么要使用两种不同的方法slice()和substring()?

来自分类Dev

重构:结合两种方法

来自分类Dev

重构:结合两种方法

来自分类Dev

使用两种不同的方法调用方法

来自分类Dev

SOAP:使用两种令牌:UsernameToken和EncryptedToken

来自分类Dev

与泛型类型方法的接口

来自分类Dev

使用接口和泛型在Java中绘制按钮

来自分类Dev

C#使用泛型和接口实现

来自分类Dev

使用接口和泛型在Java中绘制按钮

来自分类Dev

使用接口的泛型转换

来自分类Dev

使用接口的泛型转换

来自分类Dev

不使用Web API两种不同的GET方法

来自分类Dev

将两种方法重构为一种具有相同字段但名称不同的方法