C# “嵌套”或“链接”泛型

本文关键字:泛型 链接 嵌套 | 更新日期: 2023-09-27 18:33:56

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

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

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

我不知道我应该在"哪里 T"之后放什么。

我在这里找到了两个解决方案:C# 泛型"where 约束"与"任何泛型类型"定义?

第一个解决方案是在 IRequest 中指定 IResponse 泛型的类型,如下所示:

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

但这似乎很奇怪,因为请求应该只知道响应,而不是响应应该在 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

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

C# “嵌套”或“链接”泛型

怎么样:

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

通过这种方式,您可以说: new MyRequest().GetResponse().GetData() 而不必担心确切的中间响应类型。

你有没有可能把它复杂化了? 以下是我如何实现我认为您想要做的事情:

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();