SQLite泛型类调用Query方法报错:‘T’需非抽象无参构造类型求解
问题排查与修复
核心问题分析
你遇到的错误有两个根源:
- 方法级泛型参数冗余:
AddData<T>和GetDB<T>中重新声明了泛型参数<T>,这会覆盖类级的T,导致方法内的T不受任何约束,而SQLite的Query<T>等方法要求泛型参数必须满足特定条件。 - 缺少泛型约束:SQLite的
CreateTable<T>、Insert<T>、Query<T>方法都要求泛型类型T是非抽象、拥有公共无参构造函数的引用类型,你的类级泛型T没有添加这些约束,导致无法满足SQLite方法的要求。
修复后的代码
public class DB_Processor_Generic<T> where T : class, new() { private SQLite.SQLiteConnection _db; private string _path; // 构造函数 public DB_Processor_Generic(string path) { _path = path; _db = new SQLite.SQLiteConnection(this._path); _db.CreateTable<T>(); } // 添加数据方法(移除冗余的方法级泛型参数) public void AddData(T t1) { _db.Insert(t1); } // 查询数据方法(移除冗余的方法级泛型参数) public List<T> GetDB(string tableName) { var DB_List = _db.Query<T>($"SELECT * FROM {tableName}"); return DB_List; } }
关键修复点说明
- 添加类级泛型约束:
where T : class, new()确保T是引用类型,且拥有公共无参构造函数,完全满足SQLite方法的参数要求。 - 移除方法级泛型参数:方法直接使用类级的
T即可,无需重复声明,避免泛型参数混淆,同时自动继承类级的约束。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

