【问题标题】:Using a generic type inside another generic in C# class that uses SQLite db in Xamarin在 Xamarin 中使用 SQLite db 的 C# 类中的另一个泛型中使用泛型类型
【发布时间】:2017-12-18 09:51:53
【问题描述】:

我有一个简单的数据库控件处理程序类。

它使用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 指定new() 约束。

标签: c# sqlite generics xamarin


【解决方案1】:

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

添加一个new() 约束来解决这个问题:

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

这将T 限制为具有无参数构造函数的类。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2014-08-02
      • 2021-12-25
      相关资源
      最近更新 更多