2009-06-11 148 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; 

我也想知道如果有一個更優雅的方式來做到這一點?編輯:我缺乏的班級;意味着在那裏獲得/設置。

編輯:從對象更改爲結構。出於某種原因,當我這樣做時,它不喜歡設置結構的屬性。

+0

既然你編輯的代碼我看不出有什麼明顯的原因爲什麼它是行不通的。您是否使用調試器完成了代碼?它是否返回兩個對象的完整屬性列表?這些名字是完全相同的嗎?它是否達到SetValue代碼行? – 2009-06-11 16:15:04

+0

Doh,我的壞。我認爲他們都是對象,但一個是結構,一個是對象。難怪GetValue/SetValue不起作用! – 2009-06-11 16:24:29

回答

1

你在類中定義的東西是字段不屬性,所以它們不會被GetProperties()方法列出。

嘗試其更改爲(例如):

public int ItemId { get; set; } 

假設你是在.NET 3.0或更高版本,否則:

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

我懷疑這是你正在嘗試做雖然?繼承可能是一個讓它更優雅的選項 - 將共享屬性分解爲基類。但是,如果只有這兩個屬性,那麼直接複製值的代碼有什麼問題?

+0

這只是一個簡單的例子,我真正使用的對象具有相當多的屬性,我希望讓代碼處理它而不是全部寫出。 – 2009-06-11 16:15:22

3

您可以使用AutoMapper,它允許您配置一個映射,以便可以將一個對象轉換爲另一個對象。

博客文章:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx

下面是AutoMapper的Projection頁面爲例

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

我會考慮一個對象屬性,而不是,然後做一個克隆複製的價值。這整個方法看起來像一個黑客。如果這些屬性有不同的類型呢?

您也可以使用和界面來定義IAdressSupport以查找支持的項目。

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

相關問題