在另一个对象中设置类似的对象属性

时间:2009-06-11 16:05:27

标签: .net reflection c#-2.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;

我也想知道是否有更优雅的方法来做到这一点?

编辑:我缺少课程;意味着在那里得到/设置。

编辑:从对象更改为struct。出于某种原因,我不喜欢在我这样做时设置结构的属性。

3 个答案:

答案 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");

答案 1 :(得分:1)

您在类中定义的内容是 fields 而不是属性,因此GetProperties()方法不会列出它们。

尝试将它们更改为(例如):

public int ItemId { get; set; }

假设您使用的是.NET 3.0或更高版本,否则:

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

我怀疑你要做的是什么?继承可以是使其更优雅的选项 - 将共享属性分解为基类。但是如果只有这两个属性,那么直接复制值的代码有什么问题?

答案 2 :(得分:0)

我会考虑改为创建一个对象属性,然后执行克隆来复制值。整个方法看起来像是一个黑客。如果属性有不同的类型怎么办?

您还可以使用和界面来定义IAdressSupport以查找支持的项目。

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