当前位置: 首页 > 知识库问答 >
问题:

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

裴翰学
2023-03-14

考虑一个具有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 results 但未分页。

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个答案

白君之
2023-03-14

这不是你想做的吗?

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

而不是您的:

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

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

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

 类似资料:
  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数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