0

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

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

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

4

3 回答 3

0

这没有经过测试,但你可以试试这个,假设你已经映射了它。

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

propertMap.GetSourceValueResolvers()
于 2013-09-06T15:15:05.943 回答
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;
    }
于 2013-09-06T15:19:11.150 回答
-1

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

PropertyInfo GetDestinationProperty<TSource, TDestination>(string sourceProperty)
{
    var result = typeof(TDestination).GetProperty(sourceProperty);
    return result;
}
于 2013-09-06T14:32:15.907 回答