如何根据MaxLength属性使AutoMapper截断字符串?

Sup*_*JMN 5 .net c# automapper

我有一个DTO,我想映射到一个实体。实体具有一些用属性修饰的MaxLength属性。

我希望AutoMapper在根据MaxLength每个属性映射到我的实体时截断来自DTO的所有字符串,这样在保存实体时不会出现验证错误。

因此,如果实体是这样定义的:

public class Entity 
{
    [MaxLength(10)]
    string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想这样做:

var myDto = new MyDto() { Name = "1231321312312312312312" };
var entity = Mapper.Map<Entity>(myDto);
Run Code Online (Sandbox Code Playgroud)

结果entityName限制为最多10个字符。

Bid*_*dou 5

我不确定这是放置该逻辑的好地方,但这里有一个适合您的情况的示例(AutoMapper 4.x):Custom Mapping with AutoMapper

在此示例中,我正在读取MapTo实体上的自定义属性,您可以对MaxLength.

这是当前版本 AutoMapper (6.x) 的完整示例

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(configuration =>
            configuration.CreateMap<Dto, Entity>()
                .ForMember(x => x.Name, e => e.ResolveUsing((dto, entity, value, context) =>
                {
                    var result = entity.GetType().GetProperty(nameof(Entity.Name)).GetCustomAttribute<MaxLengthAttribute>();
                    return dto.MyName.Substring(0, result.Length);
                })));

        var myDto = new Dto { MyName = "asadasdfasfdaasfasdfaasfasfd12" };
        var myEntity = Mapper.Map<Dto, Entity>(myDto);
    }
}

public class Entity
{
    [MaxLength(10)]
    public string Name { get; set; }
}

public class Dto
{
    public string MyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)