【问题标题】:How to use generic with SQLite如何在 SQLite 中使用泛型
【发布时间】:2022-08-09 11:45:57
【问题描述】:

我创建了一个名为 DB_Processor_Generic 的类,用于创建不同的数据库并进行添加/获取数据操作。但是我需要将这个类与不同的数据类型一起使用,所以我考虑使用泛型,但是当我使用\"_db.Query()\"如下所示,我收到错误消息

\'T\' 必须是具有公共无参数的非抽象类型 构造,以便将其用作泛型类型中的参数 \'T\' 或方法 \'SQLiteConnection.Query(string, params object[])

我的代码有什么问题吗?因为我是这个社区的新手,如果我的问题描述有任何问题,请纠正我,谢谢

    public class DB_Processor_Generic<T>
    {
        private SQLite.SQLiteConnection _db;
        private string _path;

        //Constructor
        public DB_Processor_Generic(string path)
        {
            _path = path;
            _db = new SQLite.SQLiteConnection(this._path);
            _db.CreateTable<T>();
        }

        //Method
        public void AddData<T>(T t1)
        {
            _db.Insert(t1);
        }

        public List<T> GetDB<T>(string tableName)
        {
            var DB_List = _db.Query<T>($\"SELECT * FROM {tableName}\");
            return DB_List;
        }
    }

    标签: c# sqlite generics


    【解决方案1】:

    该错误告诉您需要在 T 中添加约束:

    public class DB_Processor_Generic<T> where T : new()
    

    因为Query&lt;T&gt; 在它的定义中对 T 有这个约束,所以你也必须设置你的 T 才能使用你的 T 作为它的类型参数。

    【讨论】:

    • 详细地说,如果Query 将返回T 类型的对象列表,那么它显然需要能够创建这些对象,它通过调用该类型的无参数构造函数来实现。您必须通过应用该约束来保证在运行时为T 指定的任何类型都将具有无参数构造函数。如果您随后尝试指定没有无参数构造函数的类型,编译器会将其标记为无效。
    • 谢谢,我应该像var DB_List = _db.Query&lt;T&gt;($"SELECT * FROM {tableName}") where T:new(); 这样写这个声明吗?但似乎where 关键字无效
    • @Jonesopolis 我已尝试根据您的建议更改代码,但错误仍然存​​在,我仍然不知道出了什么问题
    • where T : new() 位于您定义 T 的行上。这是在你的课上。只需复制我上面的代码并替换您的类定义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多