我有两个对象包含一些完全相同的属性(相同的名称,类型)。我想要做的是将一个对象的相同属性填充到另一个对象的属性中。我试图在代码中执行此操作,但它不起作用。未设置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。出于某种原因,我不喜欢在我这样做时设置结构的属性。
答案 0 :(得分:3)
您可以使用AutoMapper来配置地图,以便将一个对象翻译为另一个对象。
以下是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)