提问者:小点点

如何对需要泛型类型的基类和接口使用泛型类型?


考虑一个具有pagedresults的API,如下所示:

public class PagedResult<T> : PagedResultBase where T : class
{
    public IList<T> Results { get; set; }

    public PagedResult()
    {
        Results = new List<T>();
    }
}

PagedResultBase很简单,只有页面大小和跳过计数属性。

此外,现在我还有一些result类,它们也包含公共IListresults但未分页。

public class Response
{
    public List<AListDto> Results { get; set; }
}

在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容:

public interface IGetListResponse<T>
{
    IList<T> Results { get; set; }
}

我将PagedResults更改为:

public class PagedResult<T> : PagedResultBase where T : class, IGetListResponse<T>

错误

但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。

//Compiler error CS0311
//The type 'BListDto' cannot be used as type parameter 'T' in the generic type or method 'PagedResult<T>'. There is no implicit reference conversion from 'BListDto' to 'IGetListResponse<T>'.
public class Response : PagedResult<BListDto>

但是,如果我将接口实现定义添加到继承位置,编译器似乎可以这样做。

//Base class no longer implements interface
public class PagedResult<T> : PagedResultBase where T : class

//Many locations in code would need to change to this
public class Response : PagedResult<BListDto>, IGetListResponse<BListDto> ...
public class Response : IGetListResponse<AListDto> ...

对我来说,这似乎很烦人,因为“T”定义在基类和接口上都重复。

是否有一种方法可以使用泛型正确设置IGetListResponse接口,这样我就可以只将它应用于基分页类,以及直接应用于(少得多的)非分页响应?

最小代码示例

我怎样才能更改这段代码,使它可以编译?而不必直接指定bresponse:interface

public class PagedResult<T> where T : class, IGetListResponse<T>
{
    public IList<T> Results { get; set; }

    public PagedResult()
    {
        Results = new List<T>();
    }
}

public class AResponse : IGetListResponse<Foo>
{
    public IList<Foo> Results { get; set; }
}

public interface IGetListResponse<T>
{
    IList<T> Results { get; set; }
}

public class BResponse : PagedResult<Foo>
{

}

public class Foo { }

共1个答案

匿名用户

这不是你想做的吗?

public class PagedResult<T> : IGetListResponse<T> where T : class

而不是您的:

public class PagedResult<T> where T : class, IGetListResponse<T>

在您的代码中,PagedResult没有实现IGetListResponse

IGetListResponse是对T泛型类型的约束。