2016-05-17 8 views
1

Beim Start der Anwendung erstellen wir eine neue MapperConfiguration und konfigurieren sie für die Verwendung unserer Profile. In einigen Profilen verwenden wir einen benutzerdefinierten ValueResolver, um Daten zu konvertieren.Benutzerdefinierten ValueResolver aus MapperConfiguration ermitteln

Nachdem die Konfiguration abgeschlossen ist, können wir so etwas ausführen, um alle zugeordneten Eigenschaften und Typen abzurufen.

In diesem Beispiel bekomme ich nur das erste Mapping, aber das ist nur für Beispielzwecke. Das Problem, das ich habe, bestimmt den benutzerdefinierten Resolver, der in einem bestimmten Mapping verwendet wird.

ich gefunden habe, dass jede Abbildung, die eine benutzerdefinierte Resolver hat scheint < Wert Resolver von DelegateBasedResolver haben>

var resolver = (from a in mapping.GetSourceValueResolvers() 
       let b = a.GetType() 
       where b.IsGenericType 
       && b.GetGenericTypeDefinition() == typeof(DelegateBasedResolver<>) 
       select a).FirstOrDefault(); 

Dies scheint und zu arbeiten, wenn eine benutzerdefinierte Resolver ist mit dem Mapping-Resolver nicht angeschlossen ist Null. Aber das ist soweit ich gekommen bin.

Lassen Sie uns sagen, dass ich eine einfache Abbildung wie dieses:

public class ExampleProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ExampleDto, ExampleSummary>() 
      .ForMember(a => a.Id, a => a.MapFrom(b => b.ExampleId)) 
      .ForMember(a => a.IsEnabled, a => a.ResolveUsing<CustomStringToBooleanResolver>().FromMember(b => b.is_enabled)); 
    } 
} 

Was ich versuche oben von der Zuordnung zu erhalten, ist entweder der Typ CustomStringToBooleanResolver oder eine Instanz davon. Ich denke, ich weiß, wie man den Resolver ausführt, aber das ist nicht das, was ich tun möchte. Hat jemand Ideen?

Antwort

0

Nun, nachdem ich etwas gegraben habe, fand ich die Antwort darauf, indem ich von 4.2.1 auf die neueste Betaversion von 5.0 hochstufte.

Der Code sieht nun in etwa so:

var entry = new TranslationEntry(sourceType, destinationType); 
var propertyInfo = mapping.SourceMember as PropertyInfo; 
if (propertyInfo == null && mapping.ValueResolverConfig != null) 
{ 
    entry.Resolver = mapping.ValueResolverConfig.Type; 
    var expression = mapping.ValueResolverConfig.SourceMember.Body as MemberExpression; 

    if (expression != null) 
     propertyInfo = expression.Member as PropertyInfo; 
} 

if (propertyInfo == null) 
    return; 

entry.DestinationProperty = mapping.DestinationProperty.Name; 
entry.DestinationPropertyType = mapping.DestinationPropertyType; 
entry.SourceProperty = propertyInfo.Name; 
entry.SourcePropertyType = propertyInfo.PropertyType;