Automapper obecnie nie obsługuje właściwość typu oparciu ignoruje.
Obecnie istnieją trzy sposoby, aby ignorować właściwości:
użyć opcji Ignore()
podczas tworzenia odwzorowania
Mapper.CreateMap<Source, Dest>()
.ForMember(d => d.IgnoreMe, opt => opt.Ignore());
to czego chcesz uniknąć.
Adnotacje na swoim IEnumerable<SelectListItem>
właściwości z The IgnoreMapAttribute
Jeśli IEnumerable<SelectListItem>
nazwy właściwości wykonaj jakąś konwencję nazewnictwa. Na przykład. wszystko im zacząć ze słowem "Select"
można użyć metody AddGlobalIgnore
ignorować je globalnie:
Mapper.Initialize(c => c.AddGlobalIgnore("Select"));
ale z tym można dopasować tylko z rozruchów.
Jednak można utworzyć metodę rozszerzenia wygodą dla pierwszych opcji, które będą automatycznie ignorować właściwości danego rodzaju podczas rozmowy CreateMap
:
public static class MappingExpressionExtensions
{
public static IMappingExpression<TSource, TDest>
IgnorePropertiesOfType<TSource, TDest>(
this IMappingExpression<TSource, TDest> mappingExpression,
Type typeToIgnore
)
{
var destInfo = new TypeInfo(typeof(TDest));
foreach (var destProperty in destInfo.GetPublicWriteAccessors()
.OfType<PropertyInfo>()
.Where(p => p.PropertyType == typeToIgnore))
{
mappingExpression = mappingExpression
.ForMember(destProperty.Name, opt => opt.Ignore());
}
return mappingExpression;
}
}
i można użyć go w następujący sposób :
Mapper.CreateMap<Source, Dest>()
.IgnorePropertiesOfType(typeof(IEnumerable<SelectListItem>));
Więc to jeszcze nie będzie globalne rozwiązanie, ale nie masz do listy właściwości, które powinny być ignorowane, a to działa na stwardnienie właściwa więzi tego samego typu.
Jeśli nie boi się dostać w swoje ręce brudne:
Obecnie istnieje bardzo hacky rozwiązanie, które idzie dość głęboko do wewnętrznych części Automapper.Nie wiem, jak to jest publiczne API więc ten hamulec rozwiązanie może w filmie:
Możesz zapisać się na ConfigurationStore
„s TypeMapCreated
imprezy
((ConfigurationStore)Mapper.Configuration).TypeMapCreated += OnTypeMapCreated;
i dodać typ oparciu ignorować bezpośrednio na utworzony TypeMap
przypadki:
private void OnTypeMapCreated(object sender, TypeMapCreatedEventArgs e)
{
foreach (var propertyInfo in e.TypeMap.DestinationType.GetProperties())
{
if (propertyInfo.PropertyType == typeof (IEnumerable<SelectListItem>))
{
e.TypeMap.FindOrCreatePropertyMapFor(
new PropertyAccessor(propertyInfo)).Ignore();
}
}
}
Dzięki tak znalazłem AddGlobalIgnore, ale chciałem zrobić to na typ. IgnorePropertiesOfType wygląda dobrze dzięki. Po prostu denerwujące, musimy dodać to do setek maszyn wirtualnych. Więc nie ma możliwości przeszukiwania wszystkich zmapowanych modeli i poprzez odbicie znaleźć właściwości z typem IEnumerable, a następnie zastosować atrybut ignorowania? –
GraemeMiller
Aby dynamicznie dodawać atrybuty, będziesz coś, co wstrzykuje IL jak Postharp. Jednak znalazłem raczej brudny/hacky rozwiązanie golbal. Zaktualizuję moją odpowiedź. – nemesv
Tak, tylko patrzyłem na źródło. Widziałem, gdzie GlobalIgnore został wciągnięty, myślał o zmianie źródła dla nas, ale wygląda na to, że to wystarczy! Dzięki – GraemeMiller