如何将适配器模式应用于集合?

时间:2010-11-27 16:32:45

标签: c# design-patterns collections .net-2.0 adapter

  

鉴于下面的两个课程,我怎么能   将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 个答案:

答案 0 :(得分:3)

我认为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);
}