В предыдущих версиях 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" }));
}
}