通过特定的where子句在C#中创建泛型方法

Sam*_*ami 2 .net c# generics generic-collections generic-constraints

我想创建一些通用方法,如下面的代码:

public async Task<T> Get<T>(string url) where T : IBaseModel, IList<IBaseModel>
Run Code Online (Sandbox Code Playgroud)

显然我想支持可枚举的集合以及从IBaseModel界面驱动的单个对象.方法定义没问题,但是当涉及到它的用法时,我会得到以下错误:

await myClass.Get<List<DrivedClassFromBaseModel>>("some url");

There is no implicit conversion from "System.Collection.Generic.List<DrivedClassFromBaseModel> to System.Collection.Generic.IList<IBaseModel>"
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 5

通用约束将由AND组合,因此where T : IBaseModel, IList<IBaseModel>意味着T应该实现两者IBaseModelIList<IBaseModel>.

您需要创建两个方法:

public async Task<T> Get<T>(string url) where T : IBaseModel
public async Task<IList<T>> GetList<T>(string url) where T : IBaseModel
Run Code Online (Sandbox Code Playgroud)