在接口内部创建方法通用

时间:2010-08-03 16:17:36

标签: c# web-services

我希望实现此方法,但实现者希望在他/她的子类中实现。此方法位于接口:

object GetResponseData(object response);

我放入了对象,因为我想如果我这样做,那么他们可以指定他们想要的任何作为传入响应类型并决定他们希望这个方法返回什么。我知道我应该这样做,我想和Generics一样。

我最终遇到的问题是这个接口的一些实现可能没有使用HttpRequest或HttpResponse,所以它可能传入一个HttpResponse或与GetClesponseData方法完全不同的东西,比如某个WebClient对象...所以既然如此我不知道它将如何实现,我希望这是通用的。

GetResponseData是从响应流中提取数据的逻辑,对其进行反序列化,然后将数据返回给调用者,然后返回我们想要(对象)的数据。

更新:

这是我目前的界面(在你的建议之前):

public interface IAPIResponse
{

    bool HasResponseErrors { get; }

    IAPIError[] APIErrors { get; }

    string ResponseStatusCode { get; }

    object GetResponseData(HttpWebResponse response);

}

3 个答案:

答案 0 :(得分:4)

如果您不想约束界面本身:

TReturn GetResponseData<TReturn, TResponse>(TResponse response);

或者,如果您确实希望将此约束到接口并实现许多处理不同返回和响应的类:

public interface IGetReponse<TReturn, TResponse>
{
   TReturn GetResponseData(TResponse reponse);
}

但是,值得注意的是,如果您使用第一个示例,您将最终使用与其接口的每个类重复的相同方法。也许抽象的实现可能是实现这一目标的更好方法吗?

public abstract class GetReponse
{
   public abstract TReturn GetResponseData<TReturn, TResponse>(TResponse response);
}

答案 1 :(得分:3)

我认为你要求下面两个选项之一,但有点不清楚。

通用界面:

public interface IInterface<TResult, TInput>
{
    TResult GetResponseData(TInput response);
}

// usage
public class ImplementerOfIInterface : IInterface<string, int>
{
    // ...
    string GetResponseData( int response ) {/*  code */}
    // ... 
}

通用方法:

public interface IInterface
{
    TResult GetResponseData<TResult, TInput>(TInput response);
}

答案 2 :(得分:0)

<强> 重写

根据您澄清的问题,我不确定泛型是否会为您的方案提供很多价值。在你的情况下,使用泛型将有避免装箱/拆箱的潜在好处 - 但我不希望这种好处实际上是有意义的(或者甚至必然相关,因为你可能处理类而且从不结构化)。

考虑一下:

您提到您不希望约束response的类型 - 如果您可以说“每response必须从WebResponse派生”那么您会有一个案例使用这样的泛型:

object GetResponseData<T>(T response) where T : WebResponse;

...接受WebResponse', FileResponse , FtpResponse , and HttpResponse (and any other types which inherit from WebResponse as valid parameters--and would let you access the properties/methods of WebResponse to manipulate the回复。

但是,如果没有这种类型的规则,您将无法添加约束 - 事实上,您最终会非常接近您开始的地方:

object GetResponseData(object response);