2013-09-29 113 views
0

這是使用.NET 4.5泛型方法與observablecollections

我發現自己複製相同的代碼爲每個「對象」,我有一個8.1的Windows商店應用。所以我試圖創建一個更通用的方法來獲取我想要的所有數據。原來一切都是<Typed>我的不同的對象,但現在我試圖使用通用<Object>

public async Task<ObservableCollection<object>>selectAll() 
    { 
     var Items = await Win8StorageHelper.LoadData("person.dat", typeof(ObservableCollection<object>)); 
     ObservableCollection<object> ItemsList = new ObservableCollection<object>(); 
     if (typeof(Int32) == Items.GetType()) 
     { 
      //Not Needed anymore 
     } 
     else 
     { 
      ItemsList = (ObservableCollection<object>)Items; 
     } 
     _list.Clear(); 
     foreach (object item in ItemsList) 
     { 
      _list.Add(item); 
     } 

     return _list; 
    } 

我有我原來的集合_frequencyList,現在一個新的通用集合_list:

private ObservableCollection<win8Chores.Model.databaseTables.Frequency> _frequencyList; 
    public ObservableCollection<Object> _list = new ObservableCollection<Object>(); 

我想打電話給我新的方法是這樣的:

_frequencyList = await selectAll(); 

然而,我出現錯誤:

Cannot implicitly convert type 'System.Collections.ObjectModel.ObservableCollection' to 'System.Collections.ObjectModel>observableCollection'

我需要做些什麼才能使此代碼正常工作?我是否在正確的軌道上?任何幫助表示讚賞。

更新: 這是我試圖重構了通用例如原來的方法:

public async Task<ObservableCollection<Person>> selectAllPersons() 
    { 
     var personItems = await Win8StorageHelper.LoadData("person.dat", typeof(ObservableCollection<Person>)); 
     ObservableCollection<Person> personItemsList = new ObservableCollection<Person>(); 
     if (typeof(Int32) == personItems.GetType()) 
     { 
      //Not Needed anymore 
     } 
     else 
     { 
      personItemsList = (ObservableCollection<Person>)personItems; 
     } 
     _personList.Clear(); 
     foreach (Person item in personItemsList) 
     { 
      _personList.Add(item); 
     } 

     return _personList; 
    } 

    public async Task<ObservableCollection<Frequency>> selectAllFrequencies() 
    { 
     var frequencyItems = await Win8StorageHelper.LoadData("frequency.dat", typeof(ObservableCollection<Frequency>)); 
     ObservableCollection<Frequency> frequencyItemsList = new ObservableCollection<Frequency>(); 
     if (typeof(Int32) == frequencyItems.GetType()) 
     { 
      //Not Needed anymore 
     } 
     else 
     { 
      frequencyItemsList = (ObservableCollection<Frequency>)frequencyItems; 
     } 
     _frequencyList.Clear(); 
     foreach (Frequency item in frequencyItemsList) 
     { 
      _frequencyList.Add(item); 
     } 
     return _frequencyList; 
    } 
    public async Task<ObservableCollection<Chore>> selectAllChores() 
    { 
     var choreItems = await Win8StorageHelper.LoadData("chore.dat", typeof(ObservableCollection<Chore>)); 
     ObservableCollection<Chore> choreItemsList = new ObservableCollection<Chore>(); 
     if (typeof(Int32) == choreItems.GetType()) 
     { 
      //Not Needed anymore 
     } 
     else 
     { 
      choreItemsList = (ObservableCollection<Chore>)choreItems; 
     } 
     _choreList.Clear(); 
     foreach (Chore item in choreItemsList) 
     { 
      _choreList.Add(item); 
     } 
     return _choreList; 
    } 
+0

*? –

+0

我正在爲每種類型重寫相同的方法。我認爲它可以被重構,所以我不必一遍又一遍地重寫相同的方法。這不是正確的路嗎? – webdad3

+1

聽起來像泛型的情況。這可以讓你保留這些類型並且仍然是靈活的。 – usr

回答

1

你需要像這樣

public async Task<ObservableCollection<T>> selectAllItems<T>(ObservableCollection<T> _list) 
{ 
    var items = await Win8StorageHelper.LoadData(string.Format("{0}.dat",typeof(T).Name.ToLower()), typeof(ObservableCollection<T>)); 

    _list.Clear(); 
    if(!(items is ObservableCollection<T>)) 
    { 
     return _list; 
    } 

    ObservableCollection<T> itemsList = (ObservableCollection<T>)items;   
    foreach (T item in itemsList) 
    { 
     _list.Add(item); 
    } 

    return _list; 
} 

_list是你需要添加的所有項目的參數。

爲什麼*您使用`object`,而不是特定類型現在然後調用它像

selectAllItems(_personList); 
selectAllItems(_frequencyList); //etc 
+0

Sakthievel - 我不斷收到錯誤的「T」:命名空間名稱「T」無法找到...我在這裏錯過了什麼? – webdad3

+0

更新代碼,方法簽名就像這樣'public async Task > selectAllItems (ObservableCollection _list)' –

+0

今晚我得試試這個。你知道在Windows商店應用程序中使用.Net 4.5進行泛型是否有區別? – webdad3

2

,我認爲你應該使用這個仿製藥;見Introduction to C# Generics

public async Task<ObservableCollection<T1>> selectAll<T1>(string filename) 
{ 
    var Items = await Win8StorageHelper.LoadData(filename, typeof(ObservableCollection<T1>)); 

    if (Items is ObservableCollection<T1>) 
    { 
     return ((ObservableCollection<T1>)Items).ToList(); 
    } 
    else 
    { 
     // empty or not the right type; depending on what the storage helper gives us 
     return new ObservableCollection<T1>(); 
    } 
} 

稱爲由

var personList = selectAll<Person>("person.dat"); 
var frequencyList = selectAll<Person>("frequency.dat"); 
+0

我在看,以及我得到一個錯誤,說類型或命名空間'T'未找到。你是否缺少參考或裝配。我檢查了,我確實使用了System.Collections.Generic; – webdad3

+0

它應該工作,如果你做任務>;或者通過類類型或方法參數類型引用它; 可能發佈一個更大的可運行示例(LINQpad對此很有幫助),如果我有3個對象都將使用此函數,那麼我們將能夠更好地幫助 –

+0

與重寫3次相同? - 查看我更新的問題 – webdad3