C#“嵌套”或“链式”泛型?

时间:2013-10-05 04:20:07

标签: c# .net generics mono

基本上,我正在尝试这样做:

SomeRequest request = new SomeRequest();
SomeResponse response = request.GetResponse();
List<Stuff> stuff = response.GetData();

SomeRequest和SomeResponse是分别实现IRequest和IResponse接口的类:

public class SomeRequest : IRequest<SomeResponse>
{
    public SomeResponse GetResponse() { ... }
}

public class SomeResponse : IResponse<List<Stuff>>
{
    public List<Stuff> GetData() { ... }
}

我的IResponse界面如下所示:

public interface IResponse<T>
{
    T GetData();
}

我遇到的问题是我的IRequest接口。我希望我的IRequest接口的通用(T)类型为IResponse&lt; T&gt;。

public interface IRequest<T> where T : ?????
{
    T GetResponse();
}

我无法弄清楚在“哪里T”之后我应该放什么。

我在这里找到了两个解决方案:C# generic "where constraint" with "any generic type" definition?

第一个解决方案是指定IResponse&lt; T&GT;在IRequest中泛型的类型如下:

public interface IRequest<T, U> where T : IResponse<U>

但这看起来很奇怪,因为Request应该只知道Response而不是Response应该在GetData()上返回的类型。

第二个选项是创建一个非泛型接口IResponse并在IRequest的泛型类型约束中使用它,它看起来像这样:

public interface IResponse { }
public interface IResponse<T> { ... }
public interface IRequest<T> where T : IResponse 
{
    BaseResponse GetResponse();
}

然而,这个解决方案在我的SomeRequest类中引起了编译错误:

public class SomeRequest : IRequest<SomeResponse>
{
    public SomeResponse GetResponse() { ... }
}

错误CS0738:SomeRequest未实现接口成员IRequest<SomeResponse>.GetResponse(),并且最佳实现候选SomeRequest.GetResponse()返回类型SomeResponse与接口成员返回类型IResponse不匹配

所以现在我没有想法。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

怎么样:

public interface IRequest<T>
{
    IResponse<T> GetResponse();
}

这样你可以说:new MyRequest().GetResponse().GetData(),而不必担心确切的中间响应类型。

答案 1 :(得分:1)

你有可能过度复杂吗?以下是我实现我认为你想做的事情:

public interface IRequest<T>
{
    T GetResponse();
}

public interface IResponse<T>
{
    T GetData();
}

public class MyRequest : IRequest<MyResponse>
{
    public MyResponse GetResponse()
    {
        return new MyResponse();
    }
}

public class MyResponse : IResponse<MyData>
{
    public MyData GetData()
    {
        return new MyData() { Name = "Test" };
    }
}

public class MyData
{
    public string Name { get; set; }
}

我有两个接口,这两个接口的两个实现,我可以像下面那样使用它们:

MyRequest request = new MyRequest();
MyResponse response = request.GetResponse();
MyData data = response.GetData();