2016-11-17 1 views
0

В предыдущих версиях AutoMapper я создал PreCondition общего назначения, чтобы условно отображать/не отображать определенные элементы. Я достиг этого, добавив массив имен членов в параметры Карты и проверив этот список против того, который в настоящее время отображается, как показано в приведенном ниже коде.AutoMapper 5.x больше не поддерживает имя_пользователя в разрешенииContext

К сожалению, MemberName больше не отображается в разрешенииContext, поэтому я понятия не имею, какой элемент в настоящее время отображается. Я не мог найти ничего в новом разреженном разрешении Context, который привел бы меня к этой информации.

Я знаю, что могу написать много конкретных случаев PreCondition, но я использую это для типов тиллионов. Кто-нибудь знает какие-то другие способы получения текущего MemberName?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using AutoMapper; 

public class AutoMapperTest 
{ 
    public class SomeSourceType 
    { 
     public string String1; 
     public string String2; 
     public string String3; 
    } 

    public class SomeDestinationType 
    { 
     public string String1; 
     public string String2; 
     public string String3; 
    } 

    public void Test() 
    { 
     Mapper.Initialize(cfg => 
     { 
      cfg.CreateMap<SomeSourceType, SomeDestinationType>(); 

      cfg.ForAllMaps((Action<TypeMap, IMappingExpression>)((typeMap, map) => 
      { 
       map.ForAllMembers(opt => 
       { 
        opt.PreCondition(context => 
        { 
         var optionsItems = context.Options.Items; 
         var propertiesToMap = (IEnumerable<string>)(optionsItems.Keys.Contains("PropertiesToMap") ? optionsItems["PropertiesToMap"] : null); 

         // The following line no longer works because MemberName is no longer exposed! 
         return (propertiesToMap == null) || propertiesToMap.Contains(context.MemberName); 
        }); 
       }); 
      })); 
     }); 

     var source = new SomeSourceType() { String1 = "Hello", String2 = "World" }; 

     // This will map ALL properties. 
     var dest = Mapper.Map<SomeSourceType, SomeDestinationType>(source); 

     // This will only map String1 and String3. 
     dest = Mapper.Map<SomeSourceType, SomeDestinationType>(source, opts => opts.Items.Add("PropertiesToMap", new string[] { "String1", "String3" })); 
    } 
} 

ответ

1

Вы были почти там. Параметр «opt» имеет тип IMemberConfigurationExpression, который включает в себя элемент назначения как свойство. Вот ваш обновленный пример:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using AutoMapper; 

public class AutoMapperTest 
{ 
    public class SomeSourceType 
    { 
     public string String1; 
     public string String2; 
     public string String3; 
    } 

    public class SomeDestinationType 
    { 
     public string String1; 
     public string String2; 
     public string String3; 
    } 

    public void Test() 
    { 
     Mapper.Initialize(cfg => 
     { 
      cfg.CreateMap<SomeSourceType, SomeDestinationType>(); 

      cfg.ForAllMaps((Action<TypeMap, IMappingExpression>)((typeMap, map) => 
      { 
       map.ForAllMembers(opt => 
       { 
        opt.PreCondition(context => 
        { 
         var optionsItems = context.Options.Items; 
         var propertiesToMap = (IEnumerable<string>)(optionsItems.Keys.Contains("PropertiesToMap") ? optionsItems["PropertiesToMap"] : null); 

         return (propertiesToMap == null) || propertiesToMap.Contains(opt.DestinationMember.Name); 
        }); 
       }); 
      })); 
     }); 

     var source = new SomeSourceType() { String1 = "Hello", String2 = "World" }; 

     var dest = Mapper.Map<SomeSourceType, SomeDestinationType>(source); 

     dest = Mapper.Map<SomeSourceType, SomeDestinationType>(source, opts => opts.Items.Add("PropertiesToMap", new string[] { "String1", "String3" })); 
    } 
} 
Смежные вопросы