使用Automapper.TypeMap按名称映射Property

时间:2016-12-02 16:02:13

标签: c# asp.net-mvc automapper

我正在使用AutoMapper将我的MVC ViewModels映射到DTO然后再回来,并且想知道是否可以使用来自{{1}的TypeMap仅通过属性名称映射值?

我的情况是:

  1. 我通过Automapper将AutoMapper映射到ViewModel
  2. 我通过WCF调用发送DTO,验证失败。
  3. 我的DTO返回了FaultException字段失败的名称。
  4. 我需要设置DTO字典,其中包含失败的ModelState属性的名称,以及错误消息。这允许我突出显示屏幕上的错误字段。
  5. 所以我的问题在于能够将失败的ViewModel属性的string名称映射回DTO属性。我想做这样的事情:

    ViewModel

    这一切都可能吗?如果必须的话,我不介意使用var typemap = Mapper.FindTypeMapFor(typeof(DTO), typeof(Model)) string erroredPropertyName = "Prop1"; // Really extracted from my Fault // This is the bit that doesn't exist, and I need help with...... // string destination = typemap.GetDestinationFor(erroredPropertyName); ModelState.Add(destination, errorMessage); ,但如果可以的话,我宁愿不使用它。

1 个答案:

答案 0 :(得分:0)

我最终通过AutoMapper找到了一个很好的方法:

    public PropertyInfo MapDestinationPropertyNameToSourceProperty<TSource, TDestination>(string propertyName)
    {
        var typeMap =  GetTypeMap<TSource, TDestination>();

        var sourcePropName = typeMap.GetPropertyMaps().Where(m => m.DestinationProperty.Name == propertyName).Select(x => x.SourceMember.Name).FirstOrDefault();
        if (string.IsNullOrWhiteSpace(sourcePropName))
            return null;

        return typeMap.SourceType.GetProperties().FirstOrDefault(n => n.Name == sourcePropName);            
    }

这允许我传入Destination属性的名称,并返回它从中映射的属性的PropertyInfo

我本来可以返回源属性名称,但是我想要完整的PropertyInfo对象,这样我就可以在保存错误消息的属性上查找一些自定义属性。