Установить аналогичные свойства объекта в другом объекте - PullRequest
0 голосов
/ 11 июня 2009

У меня есть два объекта, которые содержат некоторые свойства, которые абсолютно одинаковы (одно и то же имя, тип). То, что я хочу сделать, это заполнить идентичные свойства одного объекта свойствами другого объекта. Я пытаюсь сделать это в коде, но это не работает. Свойства объекта Bin не устанавливаются.

class Basket{
    public Basket(int itemId, int itemGroup){
        ItemId=itemId;
        ItemGroup=itemGroup;
    }
    private int _itemId;
    private int _itemGroup;
    public int ItemId{ get{return _itemId;} set{_itemId = value};}
    public int ItemGroup{ get{return _itemGroup;} set{_itemGroup = value};}
}

struct Bin{
    public string Name;
    private int _itemId;
    private int _itemGroup;
    public int ItemId{ get{return _itemId;} set{_itemId = value};}
    public int ItemGroup{ get{return _itemGroup;} set{_itemGroup = value};}
    public bool IsEmpty;
}

Basket basket = new Basket(1,1);
Bin bin = new Bin();

PropertyInfo[] basketPI = basket.GetType().GetProperties();
PropertyInfo[] binPI = bin.GetType().GetProperties();

foreach(PropertyInfo biPI in binPI){
    foreach(PropertyInfo baPI in basketPI){
        if(baPI.Name==biPI.Name){
            biPI.SetValue(bin,baPI.GetValue(basket,null),null));
        }
    }
}

Я пытаюсь уйти от простого выполнения:

object1.ItemId = object2.ItemId;
object1.ItemGroup = object2.ItemGroup;

Мне также интересно, есть ли более элегантный способ сделать это?

РЕДАКТИРОВАТЬ: я сократил классы; предназначено, чтобы получить / установить там.

РЕДАКТИРОВАТЬ: изменено на структуру из объекта. По некоторым причинам он не любит устанавливать свойства структуры, когда я делаю это.

Ответы [ 3 ]

3 голосов
/ 11 июня 2009

Вы можете использовать AutoMapper , который позволяет настроить карту так, чтобы один объект мог быть переведен в другой.

Сообщение в блоге: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx

Ниже приведен пример из Проекции страницы AutoMapper

.
public class CalendarEvent
{
    public DateTime EventDate { get; set; }
    public string Title { get; set; }
}

public class CalendarEventForm
{
    public DateTime EventDate { get; set; }
    public int EventHour { get; set; }
    public int EventMinute { get; set; }
    public string Title { get; set; }
}

// Model
var calendarEvent = new CalendarEvent
{
    EventDate = new DateTime(2008, 12, 15, 20, 30, 0),
    Title = "Company Holiday Party"
};

// Configure AutoMapper
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date))
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour))
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));
// Perform mapping

CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);
form.EventDate.ShouldEqual(new DateTime(2008, 12, 15));
form.EventHour.ShouldEqual(20);
form.EventMinute.ShouldEqual(30);
form.Title.ShouldEqual("Company Holiday Party");
1 голос
/ 11 июня 2009

В ваших классах определены поля , а не свойства, поэтому они не будут перечислены методом GetProperties ().

Попробуйте изменить их на (например):

public int ItemId { get; set; }

Если вы используете .NET 3.0 или выше, в противном случае:

private int _itemId;
public int ItemId
{
    get { return _itemId; }
    set { _itemId = value; }
}

Я спрашиваю, что вы пытаетесь сделать, хотя? Наследование может быть вариантом, чтобы сделать его более элегантным - выделение общих свойств в базовый класс. Но если есть только эти два свойства, что не так с кодом, который просто напрямую копирует значения?

0 голосов
/ 11 июня 2009

Я хотел бы рассмотреть возможность создания свойства объекта вместо этого, а затем сделать клон для копирования значений. Весь этот подход кажется взломать. Что если свойства имеют разные типы?

Вы также можете использовать интерфейс для определения IAdressSupport для поиска поддерживаемых элементов.

PersonB.Address = directcast (PersonA.Address.Clone, Address)

...