如何根据类型忽略属性

Mar*_*arc 6 c# automapper

我正在使用AutoMapper将实体框架对象复制到另一个相同的数据库.问题是它试图复制查找表.

我试图用排除他们AddGlobalIgnoreShouldMapProperty,但它不工作.AutoMapper仍尝试复制这些属性.

这是我的代码.我想忽略以"LU"开头的属性

 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()); 
Run Code Online (Sandbox Code Playgroud)

我也试过了

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");
 });
Run Code Online (Sandbox Code Playgroud)

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");
});
Run Code Online (Sandbox Code Playgroud)

Wil*_*Ray 4

将您的配置创建为单独的配置文件,然后将该配置文件添加到映射器配置中。

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";
}
Run Code Online (Sandbox Code Playgroud)

关于如何将配置应用于Mapper创建的调用形式似乎有些愚蠢mapper.CreateMapper。我正在研究它,看看是否可以找到更多信息,如果我发现任何东西,我会更新这个答案。