C# 自动映射:根据枚举值将类映射到viewmodels 公共类BaseViewModel { 公共MyEnumValue{get;set;} 公共字符串PropA{get;set;} } 公共类Enum1ViewModel:BaseViewModel { 公共字符串PropB{get;set;} } 公共类Enum2ViewModel:BaseViewModel { 公共字符串PropC{get;set;} } 公共类Enum3ViewModel:BaseViewModel { 公共字符串PropD{get;set;} } 公共枚举髓鞘 { 价值1, 价值2, 价值3 } 公共类MyEntity { 公共MyEnumValue{get;set;} 公共字符串PropA{get;set;} 公共字符串PropB{get;set;} 公共字符串PropC{get;set;} 公共字符串PropD{get;set;} 公共字符串PropE{get;set;} } 公共类MapperProfile:Profile { 公共MapperProfile() { CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value1) .ForMember(m=>m.PropC,o=>o.Ignore()) .ForMember(m=>m.PropD,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value2) .ForMember(m=>m.PropB,o=>o.Ignore()) .ForMember(m=>m.PropD,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value3) .ForMember(m=>m.PropB,o=>o.Ignore()) .ForMember(m=>m.PropC,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); //问题:如何进行反向映射?? } }
我在推特上向吉米·博加德问了这个问题,但我认为这个答案可能会帮助更多的人,而不仅仅是我自己C# 自动映射:根据枚举值将类映射到viewmodels 公共类BaseViewModel { 公共MyEnumValue{get;set;} 公共字符串PropA{get;set;} } 公共类Enum1ViewModel:BaseViewModel { 公共字符串PropB{get;set;} } 公共类Enum2ViewModel:BaseViewModel { 公共字符串PropC{get;set;} } 公共类Enum3ViewModel:BaseViewModel { 公共字符串PropD{get;set;} } 公共枚举髓鞘 { 价值1, 价值2, 价值3 } 公共类MyEntity { 公共MyEnumValue{get;set;} 公共字符串PropA{get;set;} 公共字符串PropB{get;set;} 公共字符串PropC{get;set;} 公共字符串PropD{get;set;} 公共字符串PropE{get;set;} } 公共类MapperProfile:Profile { 公共MapperProfile() { CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value1) .ForMember(m=>m.PropC,o=>o.Ignore()) .ForMember(m=>m.PropD,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value2) .ForMember(m=>m.PropB,o=>o.Ignore()) .ForMember(m=>m.PropD,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); CreateMap() .ForMember(m=>m.EnumValue,o=>o.UseValue(MyEnum.Value3) .ForMember(m=>m.PropB,o=>o.Ignore()) .ForMember(m=>m.PropC,o=>o.Ignore()) .ForMember(m=>m.PropE,o=>o.Ignore()); //问题:如何进行反向映射?? } },c#,.net,enums,automapper,C#,.net,Enums,Automapper,我在推特上向吉米·博加德问了这个问题,但我认为这个答案可能会帮助更多的人,而不仅仅是我自己 如果在Jimmy将答案发布到这里之前我得到了他的答案,或者你们中的任何人,我都会自己回答。因为这两个类都使用枚举,这应该很简单: public class BaseViewModel { public MyEnum EnumValue {get;set;} public string PropA { get; set; } } public class Enum1ViewModel :
如果在Jimmy将答案发布到这里之前我得到了他的答案,或者你们中的任何人,我都会自己回答。因为这两个类都使用枚举,这应该很简单:
public class BaseViewModel
{
public MyEnum EnumValue {get;set;}
public string PropA { get; set; }
}
public class Enum1ViewModel : BaseViewModel
{
public string PropB {get; set;}
}
public class Enum2ViewModel : BaseViewModel
{
public string PropC {get; set;}
}
public class Enum3ViewModel : BaseViewModel
{
public string PropD {get; set;}
}
public enum MyEnum
{
Value1,
Value2,
Value3
}
public class MyEntity
{
public MyEnum EnumValue {get; set;}
public string PropA {get;set;}
public string PropB {get;set;}
public string PropC {get;set;}
public string PropD {get;set;}
public string PropE {get;set;}
}
public class MapperProfile : Profile
{
public MapperProfile()
{
CreateMap<Enum1ViewModel, MyEntity>()
.ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value1)
.ForMember(m => m.PropC, o => o.Ignore())
.ForMember(m => m.PropD, o => o.Ignore())
.ForMember(m => m.PropE, o => o.Ignore());
CreateMap<Enum2ViewModel, MyEntity>()
.ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value2)
.ForMember(m => m.PropB, o => o.Ignore())
.ForMember(m => m.PropD, o => o.Ignore())
.ForMember(m => m.PropE, o => o.Ignore());
CreateMap<Enum3ViewModel, MyEntity>()
.ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value3)
.ForMember(m => m.PropB, o => o.Ignore())
.ForMember(m => m.PropC, o => o.Ignore())
.ForMember(m => m.PropE, o => o.Ignore());
// Question: How do I do the reverse mapping??
}
}
CreateMap();
CreateMap();
CreateMap();
您可以尝试将ViewModel直接映射到MyEntity,并且(取决于您的配置),AutoMapper可能不会映射前者中不存在的任何属性
如果这对您不起作用,可以选择使用类似以下内容的条件映射:
CreateMap<MyEntity, Enum1ViewModel>();
CreateMap<MyEntity, Enum2ViewModel>();
CreateMap<MyEntity, Enum3ViewModel>();
Mapper.CreateMap()
福门博先生(
destination=>destination.PropA,
选项=>
{
选项.条件(rc=>
{
var myViewModel=(Enum1ViewModel)rc.InstanceCache.First().Value;
返回myViewModel.EnumValue==MyEnum.Value1;
});
option.MapFrom(source=>source.PropA);
}
);
此处的更多信息:不,这是不可能的,请参阅。有一个请求来解决它,但它不能与EF这样的ORM一起工作,这将导致更多的混乱
您最好的选择是枚举上的
switch
语句,并在应用程序代码中调用Mapper.Map
。代码中的问题是什么?这正是我最后得到的,扩展方法中的switch语句。再次感谢您的快速帮助!
Mapper.CreateMap<MyEntity , Enum1ViewModel>()
.ForMember(
destination => destination.PropA ,
option =>
{
option.Condition(rc =>
{
var myViewModel = (Enum1ViewModel)rc.InstanceCache.First().Value;
return myViewModel.EnumValue == MyEnum.Value1;
});
option.MapFrom(source => source.PropA);
}
);