Специализация типа; как определить и реагировать на каждый конкретный тип? - PullRequest
1 голос
/ 19 августа 2010

Представь, что у меня есть общий класс Person.Тогда у меня есть специализации этого класса, например DanishPerson и BritishPerson.

Теперь мне нужна функция, которая возвращает правильный экземпляр Persons, в зависимости от того, в какой стране они находятся, или способ легкоопределить, к какому типу людей они относятся.Итак, у меня есть функция:

List<Person> GetPersonsByCountry(int countryId)
{
    // query database, and get list of Persons in that country using EF inheritance
    // return list of persons
}

Список лиц, содержит объекты, которые типа DanishPerson или BritishPerson.В зависимости от типа, мне нужно отобразить правильную ViewModel в моем пользовательском интерфейсе.Поэтому, если в списке содержатся датчане типа DanishPerson, мне нужно отобразить один пользовательский интерфейс, который будет отображать специфические свойства датского языка (и не только).

Теперь мой вопрос: как вы делаете это наилучшим образом?Я думаю, что я всегда мог бы использовать if / else, используя typeof, но я надеялся на более элегантный и, возможно, общий способ?Я думал, что для этого могут быть какие-то модели, так как мне кажется, что это общая проблема при работе со специализациями?

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Вы можете использовать Dictionary<K, V> для хранения сопоставлений между кодами стран и соответствующим типом класса, а затем использовать метод LINQ OfType, чтобы получить только экземпляры типа, связанного с предоставленным кодом страны.

1 голос
/ 19 августа 2010

Вы можете использовать словарь для отображения поведения в соответствии с типом человека. А еще лучше создайте интерфейс Ibehaviour и унаследуйте от него два класса: один для британского и один для датского, и инкапсулируйте различное поведение между ними.

При добавлении другого типа персонажа требуется создать класс поведения и обновить словарь.

Создать словарь (приватный член класса):

Dictionary<Type, IBehaviour> mapper = new Dictionary<Type, IBehaviour>()
{
   {typeof(BritishPerson), new BritishPersonBehaviour()},
   {typeof(DanishPerson), new DanishPersonBehaviour()}
};

В коде:

Person person = ...
var behaviour = mapper[person.GetType()];
behaviour.ShowUI(); //or something like this
0 голосов
/ 19 августа 2010

Если объект List является однородным (то есть он всегда заполнен только объектами датчан или британцев, то этот маленький кусочек LINQ будет работать:

var list = GetPersonsByCountry(1);
if (list.OfType<BritishPerson>().Any())
     ShowBritishUI();
else
     ShowDanishUI();
...