从 AutoMapper 定义的映射中获取所有定义的映射

问题描述 投票:0回答:4

假设我有两个类:CD 和 CDModel,映射定义如下:

Mapper.CreateMap<CDModel, CD>()
        .ForMember(c => c.Name, opt => opt.MapFrom(m => m.Title));

是否有一种简单的方法可以从映射中检索原始表达式,例如c => c.Name(对于源)和m => m.Title(对于目标)?

我尝试过这个,但我错过了一些东西......

var map = Mapper.FindTypeMapFor<CDModel, CD>();
foreach (var propertMap in map.GetPropertyMaps())
{
    var source = ???;
    var dest = propertMap.DestinationProperty.MemberInfo;
}

如何获取源表达式和目标表达式?

c# dictionary expression automapper
4个回答
12
投票

沿着你正在做的事情走同样的路......

foreach( var propertMap in map.GetPropertyMaps() )
{
    var dest = propertMap.DestinationProperty.MemberInfo;
    var source = propertMap.SourceMember;
}

您到底想要怎样的表达方式?你想要底层的 Lambas 吗?

如果是的话请看

propertMap.GetSourceValueResolvers()

2
投票

我还发现

var map = Mapper.GetAllTypeMaps();
也很有用,因为您可以搜索 SourceTypeDestinationType


2
投票

我使用的是 Automapper 7.0,现在语法不同了。例如,

void Dump(TypeMap map)
{
    Console.WriteLine("---------------------------------------------------------------------");
    Console.WriteLine(map.SourceType + " ==> " + map.DestinationType);
    foreach (var m in map.GetPropertyMaps())
    {
        Console.WriteLine(m.SourceMember.Name + " ==> " + m.DestinationProperty.Name);
    }
}

然后你可以使用以下方式调用它:

Dump(Mapper.Instance.ConfigurationProvider.FindTypeMapFor(typeof(CDModel), typeof(CD)));

或者如果你想转储所有东西,那就这样做。

foreach (var map in Mapper.Instance.ConfigurationProvider.GetAllTypeMaps())
{
    Dump(map);
}

0
投票

在 AutoMapper 12 上,如果不使用反射,您似乎不再能够从

IMapper
IConfigurationProvider
获取有关地图或剖面图的信息。 如果您想避免反射,那么您可以通过将配置文件直接转换为 IProfileConfiguration 来至少获取
some
的信息。

如果您像我一样使用 DI 注册您的配置文件,并且您只需要映射到/来自的类型,那么您可以按照此方法执行某些操作来获取所有源/目标类型:

public class TypeMapProvider
{
  private readonly IEnumerable<Profile> profiles;

  public TypeMapProvider(IEnumerable<Profile> profiles)
  {
    this.profiles = profiles;
  }

  public IEnumerable<(Type Source, Type Destination)> GetTypeMaps()
  {
    foreach (var profile in this.profiles)
    {
      foreach (var typeMap in ((IProfileConfiguration)profile).TypeMapConfigs)
      {
        yield return (typeMap.Source, typeMap.Destination);
      }
    }
  }
}

我不确定

IProfileConfiguration.TypeMapConfigs
属性(或该接口上的任何其他属性)是否会提供有关所涉及的成员或表达式等的信息,但值得检查。

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.