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

15

假设我有两个类: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;
}
如何获得源表达式和目标表达式?
3个回答

12

按照您之前的做法继续进行...

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

你想要表达式的具体形式是什么?您是否希望获取底层Lambda表达式?

如果是这样,请参考

propertMap.GetSourceValueResolvers()

2

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


2

我正在使用Automapper 7.0,现在语法已经有所不同。例如:

Original Answer翻译成"最初的回答"

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);
}

在AutoMapper 8中,var m in map.GetPropertyMaps()的等效写法是什么? - Pawel Cioch
1
对于我的涵盖 AutoMapper 7 和 8 的解决方案,请参见 https://github.com/StefH/FluentValidation.Extensions.AutoMapper/blob/master/src/FluentValidation.Extensions/FluentValidationPropertyNameResolver.cs。 - Stef Heyenrath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接