在X#中使用SQLite db的另一个泛型中使用泛型类型

问题描述 投票:1回答:2

我有一个简单的数据库控制处理程序类。

它使用SQLiteConnection。我的SQLite数据库中有几个表。

现在我想为使用int Id作为主键的特定类型的所有表编写一个通用的简单访问器函数。因此,我有一个基类TableWithIntId,总是有一个int Id作为主键。

我的简化代码是:

private SQLiteConnection sqliteConnection;

public T LoadRecord<T>(int id) where T : Database.TableWithIntId
{
    try
    {
        return (from objTable in sqliteConnection.Table<T>()
            where objTable.Id == id
            select objTable).First();
    }
    catch (Exception ex)
    {
        ErrorMessage = ex.Message;
        return null;
    }
}

问题是,我收到以下错误:

错误CS0310:'T'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法'SQLiteConnection.Table()'中将其用作参数'T'

这对我来说很困惑,因为T是非抽象的并且具有自动默认构造函数。

public class TableWithIntId
{
    [PrimaryKey]
    public int Id { get; set; }
}  
c# sqlite generics xamarin
2个回答
3
投票

约束where T : Database.TableWithIntId只表明T必须来自Database.TableWithIntId。但是派生类不一定具有无参数构造函数(如果只给它们带有参数的构造函数)。

添加new()约束来解决:

public T LoadRecord<T>(int id) where T : Database.TableWithIntId, new()

这将T限制为具有无参数构造函数的类。


1
投票

看看new Constraint (C# Reference)

  public T LoadRecord<T>(int id) where T : TableWithIntId, new()
    {
       try
       {
           return (from objTable in sqliteConnection.Table<T>()
                   where objTable.Id == id
                   select objTable).First();
       }
       catch (Exception ex)
       {
           ErrorMessage = ex.Message;
           return null;
       }
   }
© www.soinside.com 2019 - 2024. All rights reserved.