C# 如何实现方法<;T>;(T) 从接口

C# 如何实现方法<;T>;(T) 从接口,c#,interface,C#,Interface,我正在建立一个小型基础设施,用于与不同的搜索系统(例如ApacheSolr、SQL DB等)进行通信。对于每个系统,我都有一个单独的类(=“communicator”),它实现了一个公共接口,这样后续的应用程序就可以以相同的方式与所有搜索系统“对话”。此外,每个搜索系统都有自己的类,我用它来创建实际的查询。该查询类的对象包含所有相关的查询参数,并传递给相应的communicator类。所以对于Solr来说,它看起来像这样: Solr solr = new Solr(); SolrQuery sQ

我正在建立一个小型基础设施,用于与不同的搜索系统(例如ApacheSolr、SQL DB等)进行通信。对于每个系统,我都有一个单独的类(=“communicator”),它实现了一个公共接口,这样后续的应用程序就可以以相同的方式与所有搜索系统“对话”。此外,每个搜索系统都有自己的类,我用它来创建实际的查询。该查询类的对象包含所有相关的查询参数,并传递给相应的communicator类。所以对于Solr来说,它看起来像这样:

Solr solr = new Solr();
SolrQuery sQuery = new SolrQuery();
//use some methods on sQuery to specify the query
var result = solr.query(sQuery);
interface ISearchTechnology<T>
{
  someReturnType query(T queryObject);
}
到目前为止还不错。但是如何在接口中指定查询方法?Solr类需要SolrQuery类型的对象。MySQL类需要一个MySQLQuery类型的对象

一个解决方案满足了我的要求:我将整个界面更改为:

Solr solr = new Solr();
SolrQuery sQuery = new SolrQuery();
//use some methods on sQuery to specify the query
var result = solr.query(sQuery);
interface ISearchTechnology<T>
{
  someReturnType query(T queryObject);
}
接口技术
{
someReturnType查询(T queryObject);
}
然后将Solr(例如)的类定义更改为

类解决方案:ISearch技术
这很有效。但这在概念上毫无意义。SolrQuery类型仅与这一个方法(查询)相关,而与整个类无关。我可能还需要包括其他类型(SolrQuery除外,例如SolrAnswer)。包括所有这些都是令人困惑的,违反了我对这个概念的理解

我试图将
部分附加到接口中的方法(
query(T queryObject)
),但没有找到任何实际实现它的方法

最后,我希望出现以下情况:每个communicator类实现接口所需的查询方法,但只接受一种与所有其他communicator类不同的参数类型


谢谢

您使用
ISearchTechnology
的方法是正确的,即使从概念角度来看也是正确的。

这样如何:

public interface ITechnology<TQuery, TSearch>
{
    TQuery Query(TQuery queryObject);
    TSearch Search(TSearch saerchObject);
}

public interface ISolrTechnology : ITechnology<SolrQuery, SolrSearch>
{
}

public class Solr : ISolrTechnology
{
    public SolrQuery Query(SolrQuery queryObject) {
        // ...
    }
    public SolrSearch Search(SolrSearch searchObject) {
        // ...
    }
}
公共接口技术
{
TQuery查询(tqueryqueryobject);
TSearch搜索(TSearch saerchObject);
}
公共接口隔离技术:ITechnology
{
}
公共类解决方案:隔离技术
{
公共SolrQuery查询(SolrQuery查询对象){
// ...
}
公共SolrSearch搜索(SolrSearch搜索对象){
// ...
}
}

接口隔离技术
当然是可选的
class Solr
可以继承
ITechnology
本身。

在我看来,这是对poster的问题“但是我如何在接口中指定查询方法?”的回答。这真的是唯一的选项吗?我觉得这不是直觉。我只想将类型绑定到一个方法,而不是整个类。是的。可以这样想:Solr的
ISearchTechnology
实现只能使用一种查询类型(
SolrQuery
),不管有多少种方法会使用它。如果您决定添加另一个查询方法(例如
QuerySingle
),它将使用相同的查询类型。是的,我知道您的意思。我的问题是,每个communicator类可能有100种不同的类型。对于查询、参数、响应、用户权限等,我可能只需要为一个方法使用每种类型。我只是想避免出现这样的情况:ISearchTechnology在我看来,您的设计有问题,如果每个实现有100个不同的类,并且需要在实现接口中指定每个类。为什么不抽象到接口?事实上,多态就是为了这个。欢迎来到堆栈溢出。您是否可以提供一些关于您尝试实现的搜索系统的参考信息?您在上面提到了SQL DB,但这并不是很具体。NET中已经通过Solr提供了数据抽象,SQL实际上只是引入依赖关系的示例。我的问题只针对接口、实现接口的类和用作参数的多个类型之间的关系。返回类型(如果是变量)可以添加到接口的通用参数中:
ITechnology