考虑一个具有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
我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
类型和泛型 类型系统的首要目的是检测程序错误。类型系统有效的提供了一个静态检测的有限形式,允许我们代码中明确某种类型的变量并且编译器可以验证。类型系统当然也提供了其他好处,但错误检测是他存在的理由(Raison d’Être) 我们使用类型系统应当反映这一目标,但我们必须考虑到读者(译注:读你代码的人):明智地使用类型可以增加清晰度,而过份聪明只会迷乱。 Scala的强大类型系统是学术探索和实践共
编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?
泛型类型 除了反省函数, Swift允许你定义自己的泛型类型. 它们是可以用于任意类型的自定义类、结构体、枚举, 和Array、Dictionary方式类型. 1. 定义泛型类型 定义一个普通的结构体 struct IntStack { var items = [Int]() mutating func push(_ item: Int) { items.appen
我在我们公司做项目,我有一个注入对象的问题。让我们考虑一下我有这个实体提供商: 并使用上面的实体提供程序扩展JPAContainer 问题是(我理解),我无法使用类类型定义@Inject对象,因为Inject方法需要一个空构造函数。这里有什么解决方案吗?如何让它发挥作用?现在我得到了一个例外 非常感谢您的回答:)Ondrej