2009-06-11 2 views
0

У меня есть два объекта, которые содержат некоторые свойства, которые являются точно такими же (одно и то же имя, тип). То, что я хочу сделать, это заполнить идентичные свойства одного объекта свойствами другого объекта. Я пытаюсь сделать это в коде, но он не работает. Свойства объекта 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; 

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

EDIT: Я сократил классы; предназначенный для того, чтобы получить/установить там.

EDIT: Изменен для структуры из объекта. По какой-то причине ему не нравится устанавливать свойства структуры, когда я это делаю.

+0

Поскольку вы отредактирован код, который я не вижу какой-либо очевидной причины, почему она не будет работать. Вы прошли через код с помощью отладчика? Возвращает ли он полный список свойств для обоих объектов? Являются ли имена совершенно одинаковыми в случае? Доходит ли он до строки кода SetValue? –

+0

Doh, мой плохой. Я думал, что они оба являются объектами, но одна из них является структурой, а одна - объектом. Неудивительно, что GetValue/SetValue не работал! –

ответ

1

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

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

public int ItemId { get; set; } 

Предполагая, что вы на .NET 3.0 или выше, в противном случае:

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

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

+0

Это простой пример: объекты, которые я действительно использую, имеют довольно много свойств, и я хотел бы, чтобы его обработал код, а не записывал их все. –

3

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

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

Ниже приведен пример из Projection страницы 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"); 
+0

(для automapper) ++ –

0

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

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

PersonB.Address = DirectCast (PersonA.Address.Clone, адрес)

Смежные вопросы