Как вы можете применить шаблон адаптера к коллекции? - PullRequest
2 голосов
/ 27 ноября 2010

Учитывая два приведенных ниже класса, как я могу преобразовать List<Person> в List<Person2>?

РЕДАКТИРОВАТЬ: Это сфабрикованный пример.Я пытаюсь подчеркнуть, что я не могу изменить класс Person, и мы узнаем arbitraryNumber, когда будем создавать экземпляр List<Person2>.

EDIT2: Я знаю, что многие из вас сочтут это невероятным, но этот код будет развернут на компьютере с Windows-Server-2000, что означает, что он должен работать с .NET 2.0.[Да, я нахожу это невероятным.]

public class Person
{
    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }
}

public class Person2 : Person
{
    private readonly int _arbitraryNumber;
    public Person2(int arbitraryNumber)
    {
        _arbitraryNumber = arbitraryNumber;
    }

    public string FullName
    {
        get
        {
            return String.Format("{0}, {1} - {2}", LastName, FirstName, _arbitraryNumber);
        }
    }
}

1 Ответ

3 голосов
/ 27 ноября 2010

Я думаю, что Person2 должен измениться, чтобы быть адаптером.Примерно так

public class Person2
{
    private readonly int _arbitraryNumber;
    private readonly Person _person;
    public Person2(Person person, int arbitraryNumber)
    {
        _arbitraryNumber = arbitraryNumber;
        _person = person;
    }

    public string FullName
    {
        get
        {
            return String.Format("{0}, {1} - {2}", _person.LastName, _person.FirstName, _arbitraryNumber);
        }
    }
}

Тогда адаптер на коллекцию проще.

List<Person> persons = new List<Person>();
// put some people in it.
var person2s = persons.Select(p => new Person2(4, p)); // 4 chosen arbitrarily

Или для .NET 2

List<Person2> person2s = new List<Person2>();
foreach (Person p in persons)
{
    Person2 person2 = new Person2(p, 11); // 11 arbitrarily chosen by asking a kid for a number
    person2s.Add(person2);
}
...