2015-10-03 1 views
1

Я разрабатываю простую приложение телефонной книги WPF, которая использует данные XML. Моя идея - сделать его более общим, чтобы я мог использовать данные SQL вместо данных XML , если это необходимо. Именно поэтому я выбрал базовый шаблон проектирования.Как я могу сделать словарь общим IEnumerable для шаблона Factory Design


Вот мой интерфейс (который функционирует как абстрактный класс):

public interface IPhoneBookData 
{ 
    Dictionary<string,string> GetPhoneBookData(); 
} 

Вот класс, который наследует от этого интерфейса с использованием данных XML и возвращает словарь:

using System.Collections.Generic; 
using PhoneBook.BL.XML; 
using PhoneBook.BL.XML.ParserXML; 

public class PhoneBookDataXml : IPhoneBookData 
{ 
    private string _path; 
    Dictionary<string, string> _phoneBookDict = new Dictionary<string,  
                   string>(); 

    public PhoneBookDataXml(string path) 
    { 
     _path = path; 
    } 

    public Dictionary<string, string> GetPhoneBookData() 
    { 
     var phoneBookXml = ParseXml.Deserialize<PhoneBookXml>(_path); 

     foreach (var item in phoneBookXml.Properties) 
     { 
      _phoneBookDict.Add(item.Key, item.Value); 

     } 

     return _phoneBookDict; 
    } 


} 

Вот мой завод Класс:

public static class PhoneBookDataFactory 
{ 
    public static IPhoneBookData GetPhoneBookClass(string input) 
    { 
     if (input.ToLower().Contains("xml")) 
     { 
      return new PhoneBookDataXml(input); 
     } 

     return null; 
    } 
} 

И, наконец, вот мой MainViewModel Class (WPF MVVM), который использует завод для XML:

public MainViewModel() 
{ 
    _nameList = new List<string>(); 
    _phoneList = new List<CustomKeyValuePair<string, string>>(); 

    //_phoneList = new List<string>(); 

    var PhoneBookDataInstance =    
       PhoneBookDataFactory.GetPhoneBookClass("PhoneBook.xml"); 

    _phoneBookDict = PhoneBookDataInstance.GetPhoneBookData(); 

    _nameList = _phoneBookDict.Keys.ToList(); 
} 

Я знаю, что словарь наследует ICollection, который наследует от IEnumerable, но я попытался сделать его общим и не удалось.

Я буду благодарен, если вы можете показать мне, как «GetPhoneBookData», что вернет общую коллекцию, и я смог бы преобразовать ее в словарь или любую другую коллекцию, которая потребуется в будущем.

+1

'Словарь <строка, строка>' может быть отброшен до 'ICollection >' – Hopeless

+0

Комментарий к форматированию: я отредактировал ваш вопрос, чтобы отметить новые разделы с помощью '---' (который добавляет горизонтальное правило), что более удобно для мобильных устройств, чем '=========================== и т.д. –

ответ

0

Вы должны использовать ICollection<KeyValuePair<string, string>> для _phoneBookDict

ICollection<KeyValuePair<string, string>> _phoneBookDict = new Dictionary<string, string>(); 

И IEnumerable<KeyValuePair<string, string>> как тип возвращаемого значения для метода GetPhoneBookData()

public IEnumerable<KeyValuePair<string, string>> GetPhoneBookData() 
{ 
    var phoneBookXml = ParseXml.Deserialize<PhoneBookXml>(_path); 

    foreach (var item in phoneBookXml.Properties) 
    { 
     _phoneBookDict.Add(new KeyValuePair<string, string>(item.Key, item.Value)); 
    } 

    return _phoneBookDict; 
} 
+0

Юрий, спасибо за ваш быстрый ответ, но есть кое-что, что я должен задать: в классе MainViewModel _phoneBookDict извлекает из GetPhoneBook: _phoneBookDict = PhoneBookDataInstance.GetPhoneBookData(); и GetPhoneBook возвращает IEnumerable. Итак, как я могу преобразовать его в словарь? Еще раз спасибо, Eli –

0

от вас вопрос не ясно, что именно вы хотите, но так как словарь уже ICollecion , вы можете использовать метод linq extesion для передачи данных другим типам. Вот несколько примеров:

Преобразовать в список из CustomKeyValuePairs

var phoneList = PhoneBookDataInstance 
    .GetPhoneBookData() 
    .Select(dictItem => new CustomKeyValuePair(dictItem.Key, dictItem.Value) 
    .ToList(); 

конвертировать в ObservableCollection лиц:

var persons = PhoneBookDataInstance.GetPhoneBookData() 
    .Select(dictItem => new Person 
    { 
     Name = dictItem.Key, 
     Phone = dictItem.Value 
    }; 

var observableCollection = new ObservableCollection<Person>(persons); 

так же вы можете преобразовать все, что нужно