2017-12-18 244 views
1

我有一個簡單的數據庫控制處理程序類。使用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; } 
} 
+1

你需要在'指定'新的()''爲約束T'條款where'。 –

回答

3

約束where T : Database.TableWithIntId只是說T必須從Database.TableWithIntId派生。但派生類不一定有無參數的構造函數(如果你只給它們帶參數的構造函數)。

添加new()約束來解決:

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

制約T將類與參數構造函數。

+0

完美!因爲你是第一個我接受這個! – xMRi

1

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