C# 如何有条件地映射到抽象

C# 如何有条件地映射到抽象,c#,inheritance,mapping,automapper,C#,Inheritance,Mapping,Automapper,我想将一个公共对象映射到一个抽象实例(抽象的具体实例),而不说我想要哪个具体实例。我想根据将在映射配置中设置的条件选择具体实例 就像这里: ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue()) 在这里: m.Map<X>(i2); //where X is an abstraction 配置: //config var config = new MapperC

我想将一个公共对象映射到一个抽象实例(抽象的具体实例),而不说我想要哪个具体实例。我想根据将在映射配置中设置的条件选择具体实例

就像这里:

ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue())
在这里:

m.Map<X>(i2); //where X is an abstraction
配置:

//config
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Input, XLabel>()
   .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Label));

    cfg.CreateMap<Input, XValue>()
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Amount));

    cfg.CreateMap<Input, X>()
    .Include<Input, XLabel>()
    .Include<Input, XValue>()
    .ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue())
    .ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.Id));
});
//Test
Input i1 = new Input { Id = 1, Amount = 2, };
Input i2 = new Input { Id = 1, Label = "my label" };
IMapper m = new Mapper(config);
var result1 = m.Map<X>(i1);
var result2 = m.Map<X>(i2);
Assert.IsType<XValue>(result1); //PASSED
Assert.IsType<XLabel>(result2); //PASSED

Assert.Equal("my label", ((XLabel)result1).Name);// Message: Assert.Equal() FAILURE Expected: my label; Actual:   (null)
//配置
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(dest=>dest.Name,opt=>opt.MapFrom(src=>src.Label));
cfg.CreateMap()
.ForMember(dest=>dest.Value,opt=>opt.MapFrom(src=>src.Amount));
cfg.CreateMap()
.包括()
.包括()
.ConstructUsing(y=>!string.IsNullOrEmpty(y.Label)?(X)新的XLabel():新的XValue()
.ForMember(dest=>dest.P1,opt=>opt.MapFrom(src=>src.Id));
});
映射:

//config
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Input, XLabel>()
   .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Label));

    cfg.CreateMap<Input, XValue>()
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Amount));

    cfg.CreateMap<Input, X>()
    .Include<Input, XLabel>()
    .Include<Input, XValue>()
    .ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue())
    .ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.Id));
});
//Test
Input i1 = new Input { Id = 1, Amount = 2, };
Input i2 = new Input { Id = 1, Label = "my label" };
IMapper m = new Mapper(config);
var result1 = m.Map<X>(i1);
var result2 = m.Map<X>(i2);
Assert.IsType<XValue>(result1); //PASSED
Assert.IsType<XLabel>(result2); //PASSED

Assert.Equal("my label", ((XLabel)result1).Name);// Message: Assert.Equal() FAILURE Expected: my label; Actual:   (null)
//测试
输入i1=新输入{Id=1,金额=2,};
输入i2=新输入{Id=1,Label=“我的标签”};
IMapper m=新映射器(配置);
var result1=m.Map(i1);
var result2=m.Map(i2);
请注意,我正在这样做:
var result1=m.Map(i1)非此
var result1=m.Map(i1)-这就是我想做的-我想映射到抽象而不是具体的实例

测试:

//config
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Input, XLabel>()
   .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Label));

    cfg.CreateMap<Input, XValue>()
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Amount));

    cfg.CreateMap<Input, X>()
    .Include<Input, XLabel>()
    .Include<Input, XValue>()
    .ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue())
    .ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.Id));
});
//Test
Input i1 = new Input { Id = 1, Amount = 2, };
Input i2 = new Input { Id = 1, Label = "my label" };
IMapper m = new Mapper(config);
var result1 = m.Map<X>(i1);
var result2 = m.Map<X>(i2);
Assert.IsType<XValue>(result1); //PASSED
Assert.IsType<XLabel>(result2); //PASSED

Assert.Equal("my label", ((XLabel)result1).Name);// Message: Assert.Equal() FAILURE Expected: my label; Actual:   (null)
Assert.IsType(result1)//通过
IsType(result2)//通过
Assert.Equal(“我的标签”((XLabel)result1.Name);//消息:Assert.Equal()预期失败:我的标签;实际:(空)
问题:

//config
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Input, XLabel>()
   .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Label));

    cfg.CreateMap<Input, XValue>()
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Amount));

    cfg.CreateMap<Input, X>()
    .Include<Input, XLabel>()
    .Include<Input, XValue>()
    .ConstructUsing(y => !string.IsNullOrEmpty(y.Label) ? (X)new XLabel() : new XValue())
    .ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.Id));
});
//Test
Input i1 = new Input { Id = 1, Amount = 2, };
Input i2 = new Input { Id = 1, Label = "my label" };
IMapper m = new Mapper(config);
var result1 = m.Map<X>(i1);
var result2 = m.Map<X>(i2);
Assert.IsType<XValue>(result1); //PASSED
Assert.IsType<XLabel>(result2); //PASSED

Assert.Equal("my label", ((XLabel)result1).Name);// Message: Assert.Equal() FAILURE Expected: my label; Actual:   (null)
看起来此映射不起作用:

    cfg.CreateMap<Input, XLabel>()
   .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Label));

    cfg.CreateMap<Input, XValue>()
    .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Amount));
cfg.CreateMap()
.ForMember(dest=>dest.Name,opt=>opt.MapFrom(src=>src.Label));
cfg.CreateMap()
.ForMember(dest=>dest.Value,opt=>opt.MapFrom(src=>src.Amount));

消息:Assert.Equal()预期失败:我的标签;实际:(空)您可以使用实现
XLabel
XValue
的接口,使用该接口,您将能够执行
var测试=!string.IsNullOrEmpty(y.Label)?(九) new XLabel():new XValue()
,但是从上面的代码来看,您似乎需要一个字典或自定义字典,这将更易于使用。因为我使用的是抽象类X,所以我不需要任何额外的接口-对吗?我知道我可以手动执行条件并运行具体映射,但它是stll AuoMapper吗?我想使用AutoMapper的方法/能力。非常感谢您的建议@iSR5