2009-06-11 11 views
0

全く同じ名前(同じ名前、タイプ)のいくつかのプロパティを含む2つのオブジェクトがあります。私がしたいのは、あるオブジェクトの同一のプロパティを別のオブジェクトのプロパティに代入することです。私はコードでこれをやろうとしていますが、動作しません。 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:オブジェクトから構造体に変更されました。何らかの理由で、私はこれを行うときに構造体のプロパティを設定するのが好きではありません。

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

を、私はそれはあなたががやろうとしている何であるか疑問?継承は、共有プロパティを基本クラスに分解してより洗練されたものにするオプションになるかもしれません。しかし、これらの2つのプロパティだけがある場合、値を直接コピーするコードで何が問題になりますか?

+0

これは単なる例です。実際に使用しているオブジェクトにはかなりのプロパティがあります。すべてを書き出すのではなく、コードを処理したいと思います。 –

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

(オートマッパ用)++ –

0

の例です。この全体のアプローチはハックのようです。プロパティのタイプが異なる場合はどうなりますか?

IAdressSupportを定義してインターフェイスを使用して、サポートされているアイテムを見つけることもできます。

PersonB.Address = directcast(PersonA.Address.Clone、住所)

関連する問題