2011-11-03 59 views
3

我在努力編寫通用方法來保存和加載Sterling數據庫中的數據時掙扎。C#泛型和推理類型

這是我的拯救方法:

public static void SaveList<T>(List<T> listToSave) 
{ 
    foreach (T listItem in listToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 

我得到下保存彎彎曲曲的紅線和錯誤「的類型T必須是爲了用它作爲參數T引用類型」

這是我的加載方法:

public static List<T> LoadList<T>() 
    { 
     List<T> list = (from index in DatabaseInstance.Query<T, int>() select index.Key).ToList(); 

     return list; 
    } 

我得到相同的錯誤。

任何想法?

乾杯

史蒂夫

UPDATE:

我加了其中T:類的建議,並得到了一個錯誤:

t類必須有一個公共的無參數的構造函數,以用它作爲參數

按照Bryan提供的鏈接中的說明,我在最後添加了new(),現在所有工作都正常。

回答

4

你在你的定義需要generic type constraint

public static void SaveList<T>(List<T> listToSave) where T : class 
{ 
    foreach (T listItem in listToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 

public static List<T> LoadList<T>() where T : class 
{ 
    List<T> list = (from index in DatabaseInstance.Query<T, int>() select index.Key).ToList(); 
    return list; 
} 
+0

由於鏈接到通用類型約束信息而被選擇爲答案,這有助於進一步的錯誤。 –

1

你可以試試嗎?

public static void SaveList<T>(List<T> listToSave) where T:class 
{ 
    foreach (T listItem in listToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 
2

問題是,在你現有的代碼中,T可以是任何東西。這不好,因爲Save函數只接受引用類型。

您需要放置一個constraint,它有效地向編譯器承諾T將成爲引用類型。

public static void SaveList<T>(List<T> listToSave) where T : class 
{ 
    foreach (T listItem in listToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 
1

嘗試添加class約束:

public static void SaveList<T>(List<T> listToSave) where T : class 
{ 
    foreach (T listItem in listToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 

public static List<T> LoadList<T>() where T : class 
{ 
    List<T> list = (from index in DatabaseInstance.Query<T, int>() 
      select index.Key).ToList(); 

    return list; 
} 
4

要解決你的代碼,你需要強制引用類型通用約束, 如下所示。要設置這個答案從別人已經貼出來了,我也建議你使用的IEnumerable < T>而不是列表< T>:

public static void SaveList<T>(IEnumerable<T> itemsToSave) where T : class 
{ 
    foreach (T item in itemsToSave) 
    { 
     DatabaseInstance.Save(listItem); 
    } 
} 

public static IEnumerable<T> LoadList<T>() where T : class 
{ 
    return (from index in DatabaseInstance.Query<T, int>() 
      select index.Key); 
} 

到IEnumerable的< T>的變化應該與所有現有的代碼兼容,如清單< T>已實現IEnumerable < T>。正確使用,這也可以讓你在RAM中一次只保存更少的項目,並通過允許它與其他集合類型一起使用,從而使你的代碼更強大。

+0

這兩種方法值得重新命名。也許'SaveItems'和'GetItems'? – ChaosPandion