C# 自动映射(十进制、货币)到货币

C# 自动映射(十进制、货币)到货币,c#,.net,mapping,automapper,currency,C#,.net,Mapping,Automapper,Currency,我有: 资金来源于此: 我有Autmapper的下一个配置: public class Money { public decimal Amount {get;set;} public CurrencyCodeType CurrencyCode {get;set;} //this is an enum } public class Person //Domain class { public Money Salary {get;set;} } public class P

我有:

资金来源于此:

我有Autmapper的下一个配置:

public class Money
{
   public decimal Amount {get;set;}
   public CurrencyCodeType CurrencyCode {get;set;} //this is an enum
}

public class Person //Domain class
{
   public Money Salary {get;set;}
}

public class PersonDb  //Generated from Db
{
   public decimal SalaryAmount {get;set;}
   public string  SalaryCurrencyCode {get;set;}
}
公共类MoneyProfile:Profile
{
受保护的覆盖无效配置()
{
CreateMap().ConvertUsing();
CreateMap().ConvertUsing();
}
公共类DecimalToMoneyTypeConverter:ITypeConverter
{
公共十进制转换(ResolutionContext上下文)
{
返回((Money)context.SourceValue).Amount;
}
}
公共类MoneyToDecimalTypeConverter:ITTypeConverter
{
公共资金转换(ResolutionContext上下文)
{
返回新货币((十进制)context.SourceValue);
}
}
}
公共类个人资料:个人资料
{
受保护的覆盖无效配置()
{
var mapDomainToDb=Mapper.CreateMap();
mapDomainToDb.FormMember(db=>db.SalaryAmount,options=>options.MapFrom(domain=>domain.Salary.Amount));
mapDomainToDb.FormMember(db=>db.SalaryCurrencyCode,options=>options.MapFrom(domain=>domain.Salary.CurrencyCode));
var mapdbtomain=Mapper.CreateMap();
// ?????
}
}

我不知道如何将Db映射到域,如何从decimal和string创建Money对象。请任何人都能帮助我,我是第一次使用automapper。

你应该可以这样做:

public class MoneyProfile : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<decimal, Money>().ConvertUsing<MoneyToDecimalTypeConverter>();
        Mapper.CreateMap<Money, decimal>().ConvertUsing<DecimalToMoneyTypeConverter>();
    }

    public class DecimalToMoneyTypeConverter : ITypeConverter<Money, decimal>
    {
        public decimal Convert(ResolutionContext context)
        {
            return ((Money)context.SourceValue).Amount;
        }
    }

    public class MoneyToDecimalTypeConverter : ITypeConverter<decimal, Money>
    {
        public Money Convert(ResolutionContext context)
        {
            return new Money((decimal)context.SourceValue);
        }
    }
}

public class PersonProfile : Profile
{
    protected override void Configure()
    {
        var mapDomainToDb = Mapper.CreateMap<Person, PersonDb>();
        mapDomainToDb.ForMember(db => db.SalaryAmount, options => options.MapFrom(domain => domain.Salary.Amount));
        mapDomainToDb.ForMember(db => db.SalaryCurrencyCode, options => options.MapFrom(domain => domain.Salary.CurrencyCode));

        var mapDbToDomain = Mapper.CreateMap<PersonDb, Person>();
        // ?????
    }
}
Mapper.CreateMap()
.AfterMap((src,dest)=>{
目的工资=新钱();
dest.Salary.Amount=src.SalaryAmount;
dest.Salary.CurrencyCode=enum.Parse(typeof(CurrencyCodeType),src.SalaryCurrencyCode);
});

编辑:对不起,我把事情的顺序搞错了。编辑。

你好,西蒙,谢谢你的回答。在.ForMember行(x=>x.Salary.Amount,opt=>opt.MapFrom(y=>y.salaryamunt))中,我得到了以下错误:表达式“x=>Convert(x.Salary.Amount)”必须解析为顶级成员,而不是任何子对象的属性。在子类型或AfterMap选项上使用自定义解析器。哦,当然。我真傻。您可以使用
AfterMap
。。我会更新我的答案。也许有更好的方法可以做到这一点,但我现在无法检查:/非常感谢,这对我来说很好,我开始使用autommaper,这是一个自学项目。使用此解决方案,我已经可以删除不再使用的MoneyProfile类。
Mapper.CreateMap<PersonDb, Person>()
    .AfterMap((src, dest) => {
        dest.Salary = new Money();
        dest.Salary.Amount = src.SalaryAmount;
        dest.Salary.CurrencyCode = enum.Parse(typeof(CurrencyCodeType), src.SalaryCurrencyCode);
    });