在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; }
}
回答:
约束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;
}
}
以上是 在Xamarin中使用SQLite数据库的C#类中的另一个泛型中使用泛型类型 的全部内容, 来源链接: utcz.com/qa/262230.html