2013-09-29 2 views
0

Это приложение для Windows, 8.1 Магазин с использованием .Net 4.5общие методы с observablecollections

я нашел себя тиражирование и тот же код для каждого «объекта», что у меня есть. Итак, я пытаюсь создать более общий метод, чтобы получить все данные так, как я хочу. Первоначально все было <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(); 

Однако я 'm получение ошибки:

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

Что мне нужно сделать, чтобы этот код работал? Я даже на правильном пути? Любая помощь приветствуется.

Update: Это оригинальные методы, которые я пытался реорганизовать для общего примера:

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

* Почему * Вы используете 'вместо object' ваших конкретных типов сейчас? –

+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 является параметром, где вам нужно добавить все детали.

Затем вызовите его, как

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

Sakthievel - Я продолжаю получать ошибки в «Т»: имя пространства имен «Т» не может быть найдено ... Что мне здесь не хватает? – webdad3

+0

Обновленный код, подпись метода, чтобы это выглядело как 'public async Task > selectAllItems (ObservableCollection _list)' –

+0

Мне нужно попробовать сегодня вечером. Знаете ли вы, есть ли какие-либо различия с выполнением Generics с .Net 4.5 в приложении Windows Store? – 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

Я тоже смотрю на это, и я получаю сообщение об ошибке, которое говорит, что Type или Namespace 'T' не найдено. Вам не хватает ссылки или сборки. Я проверил и у меня есть System.Collections.Generic; – webdad3

+0

он должен работать, если вы выполните задачу >; или ссылаться на него с помощью типа параметра типа или типа метода; Возможно, вы добавите большой примерный пример (LINQpad хорош для этого), и мы сможем помочь лучше –

+0

, если у меня есть 3 объекта, которые все будут использовать эту функцию, это то же самое, что и переписывание 3 раза? - См. Мой обновленный вопрос – webdad3

Смежные вопросы