考虑一个具有pagedresults
的API,如下所示:
public class PagedResult<T> : PagedResultBase where T : class
{
public IList<T> Results { get; set; }
public PagedResult()
{
Results = new List<T>();
}
}
PagedResultBase
很简单,只有页面大小和跳过计数属性。
此外,现在我还有一些result
类,它们也包含公共IList
但未分页。
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 { }
这不是你想做的吗?
public class PagedResult<T> : IGetListResponse<T> where T : class
而不是您的:
public class PagedResult<T> where T : class, IGetListResponse<T>
在您的代码中,PagedResult没有实现IGetListResponse
IGetListResponse