Как игнорировать свойства на основе их типа

Я использую AutoMapper для копирования объекта Entity framework в другую идентичную базу данных. Проблема в том, что он пытается скопировать таблицы подстановки.

Я попытался исключить их с помощью AddGlobalIgnore и ShouldMapProperty но это не работает. AutoMapper все еще пытается скопировать эти свойства.

вот мой код. Я хотел бы игнорировать свойства, которые начинаются с "Лу"

 dynamic newObject= new NewObject();

 MapperConfiguration config = new MapperConfiguration(cfg =>
 {
     cfg.CreateMissingTypeMaps = true;
     cfg.AddGlobalIgnore("LU");
     cfg.ShouldMapProperty = p => !p.GetType().ToString().StartsWith("LU");
     cfg.ShouldMapField = p => !p.GetType().ToString().StartsWith("LU");
 });
 IMapper mapper = config.CreateMapper();
 newObject = mapper.Map(objectToCopy, objectToCopy.GetType(), newObject.GetType()); 

я тоже пробовал

MapperConfiguration config = new MapperConfiguration(cfg =>
{
   cfg.CreateMissingTypeMaps = true;
   cfg.AddGlobalIgnore("LU");
   cfg.ShouldMapProperty = p => !p.PropertyType.Name.StartsWith("LU");
   cfg.ShouldMapField = p => !p.FieldType.Name.StartsWith("LU");
 });

и

MapperConfiguration config = new MapperConfiguration(cfg =>
{
   cfg.CreateMissingTypeMaps = true;
   cfg.AddGlobalIgnore("LU");
   cfg.ShouldMapProperty = p => !p.Name.StartsWith("LU");
   cfg.ShouldMapField = p => !p.Name.StartsWith("LU");
});

2 ответов


создайте свою конфигурацию как отдельный профиль, затем добавьте этот профиль в конфигурацию mapper.

class Program
{
    static void Main(string[] args)
    {
        dynamic newObject = new NewObject();
        var objectToCopy = new ObjectToCopy();

        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<MyProfile>();
        });

        var mapper = config.CreateMapper();
        mapper.Map(objectToCopy, newObject);
        // newObject.LU_Ignore = "Original value"
        // newObject.DoNotIgnore = "New value"
    }
}

class MyProfile : Profile
{
    protected override void Configure()
    {
        CreateMissingTypeMaps = true;
        ShouldMapProperty = p => !p.Name.StartsWith("LU"); // this is the correct way to get the property name
    }
}

class ObjectToCopy
{
    public string LU_Ignore { get; set; } = "New value";

    public string DoNotIgnore { get; set; } = "New value";
}


class NewObject
{
    public string LU_Ignore { get; set; } = "Original value";

    public string DoNotIgnore { get; set; } = "Original value";
}

что-то кажется глупым о том, как конфигурации применяются к Mapper создана форма mapper.CreateMapper звонок. Я изучаю его, чтобы узнать, могу ли я узнать больше информации и обновлю этот ответ, если что-нибудь найду.


Я не скажу, что это лучший (performant или дизайн-мудрый) подход, но это работает:

public static class AutoExtensions {
    public static IMappingExpression Ignore(this IMappingExpression expression, Func<PropertyInfo, bool> filter) {
        foreach (var propertyName in expression
            .TypeMap
            .SourceType
            .GetProperties()
            .Where(filter)
            .Select(x=>x.Name))
        {
            expression.ForMember(propertyName, behaviour => behaviour.Ignore());
        }

        return expression;
    }
}

вы можете настроить свой картограф следующим образом (для этих примеров классов):

public class Client {
    public string LUName { get; set; }
    public string Dno { get; set; } 
}

public class ClientDTO
{
    public string LUName { get; set; }
    public string Dno { get; set; } 
}

и проверить это такой:

private static void ConfigAndTestMapper() {
        var config = new MapperConfiguration(cfg =>{
            cfg.CreateMap(typeof (Client), typeof (ClientDTO))
                .Ignore(x => x.Name.StartsWith("LU"));
        });

        var mapper = config.CreateMapper();
        var result = mapper.Map<ClientDTO>(new Client() {LUName = "Name", Dno = "Dno"});

        var isIgnored = result.LUName == null;
    }

PS: Это также довольно "хакерский", так как он пытается отобразить все виды свойств там (только для чтения/непубличных и т. д. так что прими это с солью.