我有一个简单的数据库控制处理程序类。
它使用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; }
}
约束where T : Database.TableWithIntId
只表明T
必须来自Database.TableWithIntId
。但是派生类不一定具有无参数构造函数(如果只给它们带有参数的构造函数)。
添加new()
约束来解决:
public T LoadRecord<T>(int id) where T : Database.TableWithIntId, new()
这将T
限制为具有无参数构造函数的类。
看看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;
}
}