使用T作为类型

时间:2018-08-16 22:51:18

标签: c# generics

我有一个带有几个实体的sqlite类,并且我不想为每种类型的实体创建一个方法,如下所示:

public async List<Sheep> GetSheeps()
{
    return database.Table<Sheep>().ToListAsync();
}

public async List<Goat> GetGoats()
{
    return database.Table<Goat>().ToListAsync();
}

我想创建一个接口(例如IEntity)并继承我的绵羊和山羊的POCO类。 然后,我只想创建一种通用方法来获取物品。

这是我尝试过的方法,它说我不能使用T作为类型:

public async T GetEntities<T>()
{
    if (typeof(T) == IEntity)
        return database.Table<T>().ToListAsync();
}

也许我不完全了解T是什么。

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

近...

  • 您将要await打一个async电话
  • 由于您使用的是async await模式,因此您需要返回一个Task
  • 由于要返回T的列表,因此必须声明List<T>作为任务的通用参数,即Task<List<T>>
  • 使用约束typeof(T) == IEntity代替检查where T : IEntity类型

代码

public async Task<List<T>> GetEntities<T>() where T : IEntity
{
    return await database.Table<T>().ToListAsync();
}

尽管,但要考虑一些事情

  • 所有类都必须继承自IEntity
  • 与数据库打交道时最好使用using语句(而不保留对它的引用)
  • 这闻起来像一个存储库,您实际上并没有节省太多代码。 EF 和ORMS已经是存储库模式和工作单元

使用

var myLovelyHorseList = await GetEntities<Horse>();

更新

对我来说,这是一大早,我没喝咖啡,无法测试。但我认为您可能需要new()约束,并且您的类将必须具有无参数的构造函数

where T : IEntity, new()

new Constraint (C# Reference)

答案 1 :(得分:0)

T是类型。

在您的示例中,SheepGoat都必须是相同的对象类型。

一种实现方法是让SheepGoat都从空白接口继承。

例如

interface IAnimal {}

public class Goat: IAnimal {}

public class Sheep: IAnimal {}