在Xamarin中使用SQLite数据库的C#类中的另一个泛型中使用泛型类型

在Xamarin中使用SQLite数据库的C#类中的另一个泛型中使用泛型类型

问题描述:

我有一个简单的数据库控制处理程序类。使用SQLiteConnection。我有我的SQLite数据库中的几个表。在Xamarin中使用SQLite数据库的C#类中的另一个泛型中使用泛型类型

现在我想为所有使用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; } 
} 
+1

你需要在'指定'新的()''为约束T'条款where'。 –

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

添加new()约束来解决:

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

制约T将类与参数构造函数。

+0

完美!因为你是第一个我接受这个! – xMRi

看看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; 
     } 
    }