假设我有两个类: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;
}
如何获取源表达式和目标表达式?
沿着你正在做的事情走同样的路......
foreach( var propertMap in map.GetPropertyMaps() )
{
var dest = propertMap.DestinationProperty.MemberInfo;
var source = propertMap.SourceMember;
}
您到底想要怎样的表达方式?你想要底层的 Lambas 吗?
如果是的话请看
propertMap.GetSourceValueResolvers()
我还发现
var map = Mapper.GetAllTypeMaps();
也很有用,因为您可以搜索 SourceType 或 DestinationType。
我使用的是 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);
}
在 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
属性(或该接口上的任何其他属性)是否会提供有关所涉及的成员或表达式等的信息,但值得检查。
希望这对某人有帮助。