反映有关AutoMapper映射的信息

时间:2013-09-06 14:25:43

标签: c# asp.net-mvc automapper

给定源类型的属性名称,我需要获取目标属性的System.Reflection.PropertyInfo

PropertyInfo GetDestinationProperty<TSource, TDestination>(string sourceProperty)
{
    var map = Mapper.FindTypeMapFor(typeof(TSource), typeof(TDestination));
    // [magic]
    return result;
}

我想要解决的问题是:我有一个MVC应用程序。在保存数据库上下文之前,有一个Entity Framework模型(源类型)提供自己的验证。我正在将这个EF模型映射到一个复杂的多层ViewModel。我需要将EF验证错误转换为MVC视图模型验证错误,以便它们在客户端上很好地显示。例如,如果我在“描述”属性上收到EF错误,我需要将其转换为映射属性“Info.Description”。

3 个答案:

答案 0 :(得分:0)

这未经过测试,但您可以尝试这一点,假设您已经映射过它。

var map = Mapper.FindTypeMapFor<Source, Destination>();
        foreach( var propertMap in map.GetPropertyMaps() )
        {
            var dest = propertMap.DestinationProperty.MemberInfo;
            var source = propertMap.SourceMember;
        }

propertMap.GetSourceValueResolvers()

答案 1 :(得分:0)

我制定了一个解决方案,但代码有点混乱。要在复杂映射中获取目标属性的路径,然后我可以将其归入ModelState以获取错误,我可以使用此代码:

    public string GetDestinationPath(Type source, Type destination, string propertyName)
    {
        return GetDestinationPath(source, destination, propertyName, string.Empty);
    }

    public string GetDestinationPath(Type source, Type destination, string propertyName, string path)
    {
        var typeMap = Mapper.FindTypeMapFor(source, destination);
        if (typeMap == null)
            return null;
        var maps = typeMap.GetPropertyMaps();
        var exactMatch = maps.FirstOrDefault(m => m.SourceMember != null && m.SourceMember.Name == propertyName);
        if (exactMatch != null)
            return path + exactMatch.DestinationProperty.Name;
        foreach (var map in maps)
        {
            if (map.SourceMember == null)
            {
                var result = GetDestinationPath(source, map.DestinationProperty.MemberType, propertyName, path + map.DestinationProperty.Name + ".");
                if (result != null)
                    return result;
            }
            else
            {
                if (!(map.SourceMember is PropertyInfo))
                    continue;
                var result = GetDestinationPath((map.SourceMember as PropertyInfo).PropertyType, map.DestinationProperty.MemberType, propertyName, path + map.DestinationProperty.Name);
                if (result != null)
                    return result;
            }
        }
        return null;
    }

答案 2 :(得分:-1)

您可以使用简单的反射来实现这一目标。鉴于属性名称在源和目标中匹配,您可以编写以下代码:

PropertyInfo GetDestinationProperty<TSource, TDestination>(string sourceProperty)
{
    var result = typeof(TDestination).GetProperty(sourceProperty);
    return result;
}