C# 是否可以定义一个可以有泛型方法的非泛型接口?

C# 是否可以定义一个可以有泛型方法的非泛型接口?,c#,oop,generics,C#,Oop,Generics,我想知道这段代码是否可以改进。IProvider实现IProvider并覆盖请求(…)。我想把它们合并成一个界面。但是我仍然需要一个类型化和非类型化的接口来使用 有没有一种方法可以将两者结合起来,或者界面应该是这样的 public interface IProvider { DataSourceDescriptor DataSource { get; set; } IConfiguration Configuration { get; set; } IResult R

我想知道这段代码是否可以改进。IProvider实现IProvider并覆盖请求(…)。我想把它们合并成一个界面。但是我仍然需要一个类型化和非类型化的接口来使用

有没有一种方法可以将两者结合起来,或者界面应该是这样的

public interface IProvider
{
    DataSourceDescriptor DataSource { get; set; }

    IConfiguration Configuration { get; set; }

    IResult Request(IQuery request);
}

public interface IProvider<T> : IProvider
{
    new IResult<T> Request(IQuery request);
}
公共接口IProvider
{
DataSourceDescriptor数据源{get;set;}
IConfiguration配置{get;set;}
IResult请求(IQuery请求);
}
公共接口IProvider:IProvider
{
新IResult请求(IQuery请求);
}

如果您想拥有执行非类型化代码的能力,就不能将该方法放在泛型类中(并且在设计方面仍然有意义)。所以答案是否定的。。。当您需要非类型化和类型化接口时,您拥有的是正确的方法

但是,您可以拥有对初始接口的引用,或者将它们全部滚动到单个接口中,但是您的非类型化方法仍必须在泛型类中声明,即:

ObjectProvider<SomeObjectType> j = new ObjectProvider<SomeObjectType>();
j.DataSource = //Do something
ObjectProvider j=newobjectprovider();
j、 DataSource=//做点什么
现在,您可以始终将请求指定为通用方法,并允许两者存在于同一上下文中。。。但是这最终取决于你

public interface IProvider
{
    IResult<T> Request<T>(IQuery request);

    DataSourceDescriptor DataSource { get; set; }

    IConfiguration Configuration { get; set; }

    IResult Request(IQuery request);
}
公共接口IProvider
{
IResult请求(IQuery请求);
DataSourceDescriptor数据源{get;set;}
IConfiguration配置{get;set;}
IResult请求(IQuery请求);
}

如果泛型类型参数
T
仅与
请求
方法的上下文相关,则仅将该方法声明为泛型:

public interface IProvider
{
    DataSourceDescriptor DataSource { get; set; }

    IConfiguration Configuration { get; set; }

    IResult Request(IQuery request);

    IResult<T> Request<T>(IQuery request);
}
公共接口IProvider
{
DataSourceDescriptor数据源{get;set;}
IConfiguration配置{get;set;}
IResult请求(IQuery请求);
IResult请求(IQuery请求);
}

实际上,实现接口意味着将基本接口的成员也保留在child中-继承当然是这样工作的

那么,当您通过某个类实现子(泛型)接口时会发生什么?当然,在implementor类中,您将同时获得泛型和非泛型成员,据我所知,这并不是您想要的

解决方案:

  • 声明只包含“数据源”和“配置”成员的基本接口(例如IProviderBase)
  • 使IProvider成为IProviderBase的子级,并在其中声明非泛型请求()
  • 使IProvider成为IProviderBase的子级,并在其中声明泛型请求()

  • 有道理吗?

    我按照你们的指示做了,我想这样做就行了。我只能给1个优胜者。抱歉。下次你可能想再次检查“最老的”老板。你在他的老板之后编辑了你的老板,这就是他得到支票的原因。投票否决我的人:这没用,如果你不解释,你为什么这么做!尤其是在答案已经被接受之后。。。!我认为这是庸俗的。。。他一直在谈论他的答案应该如何被挑选出来,现在他的咆哮被删除了。我猜另一位成员可能只是删除了他不必要的评论-不确定。@Binary:很抱歉怀疑是你。由于内容不合适,删除了那篇文章。我只是对目前被抛弃的问题的数量感到失望,而且我被拒绝发表评论的事实真的让我很激动。@Daniel Hilgarth这和我离开专家交流的原因是一样的,至少他们有一个版主清理过程,在这个过程中,被抛弃的问题被强制接受。。。我认为完全由社区驱动的内容的堆栈会有所不同。。。以这种速度,我可能会回到EE。