Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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