2009-06-11 5 views
0

Ich habe zwei Objekte, die einige Eigenschaften enthalten, die genau identisch sind (gleicher Name, Typ). Ich möchte die identischen Eigenschaften eines Objekts mit den Eigenschaften eines anderen Objekts füllen. Ich versuche das im Code zu tun, aber es funktioniert nicht. Die Eigenschaften des Bin-Objekts werden nicht festgelegt.Legen Sie ähnliche Objekteigenschaften in einem anderen Objekt

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)); 
     } 
    } 
} 

Ich versuche, weg von einfach tun:

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

Ich frage mich auch, wenn es eine elegantere Weg ist, dies zu tun?

EDIT: Ich unterdrückte die Klassen; dazu bestimmt, dass man dort hinein-/hinausgeht.

EDIT: Von Objekt zu Struct geändert. Aus irgendeinem Grund mag es nicht, die Eigenschaften der Struktur zu setzen, wenn ich dies tue.

+0

Da Sie Code bearbeitet habe ich keinen offensichtlichen Grund, warum es nicht funktionieren würde. Bist du mit einem Debugger durch den Code gegangen? Gibt es eine vollständige Liste der Eigenschaften für beide Objekte zurück? Sind die Namen im Fall vollkommen identisch? Erreicht es jemals die SetValue-Codezeile? –

+0

Doh, mein Schlechter. Ich dachte, sie wären beide Objekte, aber einer ist eine Struktur und einer ist ein Objekt. Kein Wunder, dass der GetValue/SetValue nicht funktionierte! –

Antwort

1

Die Dinge, die Sie in Ihren Klassen definiert haben, sind Felder nicht Eigenschaften, so dass sie nicht von der GetProperties() -Methode aufgelistet werden.

Versuchen sie (zum Beispiel) zu ändern:

public int ItemId { get; set; } 

Angenommen, Sie sind auf .NET 3.0 oder höher, sonst:

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

ich fragen, was es ist, dass Sie versuchen, obwohl zu tun ? Vererbung kann eine Option sein, um sie eleganter zu machen - indem man die geteilten Eigenschaften in eine Basisklasse ausklammert. Aber wenn es nur diese beiden Eigenschaften gibt, was stimmt dann nicht mit dem Code, der die Werte direkt kopiert?

+0

Dies ist nur ein einfaches Beispiel, die Objekte, die ich wirklich benutze, haben ziemlich viele Eigenschaften, und ich möchte, dass der Code sie handhabt, anstatt sie alle zu schreiben. –

3

Sie könnten AutoMapper verwenden, mit dem Sie eine Karte so konfigurieren können, dass ein Objekt in ein anderes übersetzt werden kann.

Blog Beitrag: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx

Unten ist ein Beispiel von AutoMapper der Projection Seite

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

(für Autoadapter) ++ –

0

halte ich würde stattdessen eine Objekteigenschaft zu machen und dann einen Klon tun, um die Werte zu kopieren. Dieser ganze Ansatz erscheint wie ein Hack. Was ist, wenn die Eigenschaften unterschiedliche Typen haben?

Sie könnten auch verwenden und Schnittstelle zu definieren IAdressSupport, um unterstützte Elemente zu finden.

PersonB.Address = Direct (PersonA.Address.Clone, Adresse)

Verwandte Themen