Преобразование из базового объекта в унаследованный объект - PullRequest
1 голос
/ 20 августа 2009

Я пытаюсь пойти противоположным путем, чем вы обычно делаете.

У меня есть два класса POCO A и B, где B наследуется от A

public class A
{
   public int Foo { get; set; }
}

public class B : A
{
   public int Bar { get; set; }
}

B представляет собой расширение A с дополнительной информацией.

Я начинаю с экземпляра класса A

A a = new A { Foo = 1 };

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

A a = new A { Foo = 1 };
B b = new B { Foo = a.Foo, Bar = 2 };

Или в конструкторе

A a = new A { Foo = 1 };
B b = new B(a) { Bar = 2 }; // Mapping of value Foo is done in constructor of object B

Результатом в любом случае является ручное отображение значений из объекта A в B. Должен быть более разумный способ сделать это ... есть предложения?

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

Если вы на самом деле меняете тип (а не на приведение) - тогда, если у вас есть только несколько классов, просто напишите код преобразования - возможно, ctor для B, который принимает шаблон A. Если у вас много классов ... есть трюки, которые вы можете сделать с помощью динамического кода или сериализации. Например, PropertyCopy in MiscUtil сделает это (используя динамический Expression для выполнения работы очень быстро):

A a = new A { Foo = 1 };
B b = PropertyCopy<B>.CopyFrom(a);
b.Bar = 2;
0 голосов
/ 20 августа 2009

Я бы расценил «умный» способ как ваше последнее предложение - напишите конструктор копирования для B, который знает, как создать экземпляр из A.

...