Как разыграть экземпляр этих похожих классов?

У меня есть два класса, которые являются производными от общего класса A, который содержит некоторые свойства (в основном, строки и целые числа). Класс B - это другой класс, содержащий дополнительные свойства. Точнее,

public class A1 : A {
    private B _bee;
    public B Bee {
        get { return _bee;}
        set { _bee = value;}
    }
}

public class A2 : A {
    private List<B> _beeList;
    public List<B> BeeList {
        get { return _beeList;}
        set { _beeList = value;}
    }
}

Теперь, учитывая экземпляр A1, как я могу создать экземпляр A2, содержащий ту же информацию (т. Е. Свойства в части "A" и экземпляр "B"). Я попробовал следующее - я хотел, чтобы это сработало, но знал, что это не сработает... - (Позвольте мне назвать мой экземпляр А1 или А2 "один" или "два"):

A _a = (A)one; // This obv works
B _b = one.Bee; 

A2 _a2 = (A2)_a; // Threw away the Bee - information, so should work imo
_a2.BeeList.Add(_b);

Так как мне сделать это, не заполняя все свойства в A вручную?

3 ответа

Решение
 using System.Reflection;  

  private void Convert(A1 _a1, A2 _a2)
    {
        foreach(PropertyInfo pi in typeof(A).GetProperties())
        {
            pi.SetValue(_a2,
                pi.GetValue(_a1, null)
                            , null);
        }
        _a2.BeeList.Add(_a1.Bee);
    }

мне показалось, что это работает

Попробуйте использовать autopper.

Automapper позволяет вам копировать свойства одного класса в другой без написания большого количества кода.

например:

Mapper.CreateMap<X, Y>();    
Y y = Mapper.Map<X, Y>(x);

Конфигурация Automapper будет выглядеть так:

Mapper.CreateMap<A1, A2>()
      .ForMember(a2 => a2.BeeList, ctx => ctx.MapFrom(a1 => new List<B>{a1.Bee}));

A a1Object = new A1{Bee = new B()};

A2 a2Object = Mapper.Map<A2>(a1Object);
Другие вопросы по тегам