2010-08-11 6 views
5

Compte tenu de l'exigence:chaînes AutoMapper à ENUM descriptions

Prenez un graphe d'objets, définissez toutes les propriétés de type ENUM en fonction de la valeur traitée d'une seconde propriété de chaîne. La convention impose que le nom de la propriété de chaîne source soit celui de la propriété enum avec un suffixe de "Raw".

Par traitement, nous entendons que nous devrons supprimer les caractères spécifiés e.t.c.

J'ai examiné des formateurs, des résolveurs de valeurs et des convertisseurs de type personnalisés, dont aucun ne semble être une solution pour cela?

Nous voulons utiliser AutoMapper par opposition à notre propre routine de réflexion pour deux raisons, a) il est largement utilisé dans le reste du projet et b) il vous donne un ootb de traversée récursif.

- Exemple -

Compte tenu de la structure (simple) ci-dessous, et ceci:

var tmp = new SimpleClass 
    { 
     CountryRaw = "United States", 
     Person = new Person { GenderRaw="Male" } 
    }; 

var tmp2 = new SimpleClass(); 

Mapper.Map(tmp, tmp2); 

nous attendrions MappedCountry l'ENUM de tmp2 être Country.UnitedStates et la propriété d'avoir une personne sexe de Gender.Male.

public class SimpleClass1 
{ 
    public string CountryRaw {get;set;} 

    public Country MappedCountry {get;set;} 

    public Person Person {get;set;} 
} 

public class Person 
{ 
    public string GenderRaw {get;set;} 

    public Gender Gender {get;set;} 

    public string Surname {get;set;} 
} 

public enum Country 
{ 
    UnitedStates = 1, 
    NewZealand = 2 
} 

public enum Gender 
{ 
    Male, 
    Female, 
    Unknown 
} 

Merci

+1

pourrait vous montrer un exemple de ce que vous avez et ce que vous voulez mapper – Omu

+0

Bien sûr, message original édité :-) Ce – 6footunder

Répondre

5

Je l'ai fait avec le ValueInjecter, est ici la chose:

J'ai ajouté un autre accessoire à la SimpleClass juste pour vous montrer comment cela fonctionne

public class SixFootUnderTest 
{ 
    [Test] 
    public void Test() 
    { 
     var o = new SimpleClass1 
        { 
         CountryRaw = "United States", 
         GenderRaw = "Female", 
         Person = new Person { GenderRaw = "Male" } 
        }; 

     var oo = new SimpleClass1(); 

     oo.InjectFrom(o) 
      .InjectFrom<StrRawToEnum>(o); 
     oo.Person.InjectFrom<StrRawToEnum>(o.Person); 

     oo.Country.IsEqualTo(Country.UnitedStates); 
     oo.Gender.IsEqualTo(Gender.Female); 
     oo.Person.Gender.IsEqualTo(Gender.Male); 
    } 

    public class SimpleClass1 
    { 
     public string CountryRaw { get; set; } 

     public Country Country { get; set; } 

     public string GenderRaw { get; set; } 

     public Gender Gender { get; set; } 

     public Person Person { get; set; } 
    } 

    public class Person 
    { 
     public string GenderRaw { get; set; } 

     public Gender Gender { get; set; } 

     public string Surname { get; set; } 
    } 


    public class StrRawToEnum : LoopValueInjection 
    { 
     protected override bool UseSourceProp(string sourcePropName) 
     { 
      return sourcePropName.EndsWith("Raw"); 
     } 

     protected override string TargetPropName(string sourcePropName) 
     { 
      return sourcePropName.RemoveSuffix("Raw"); 
     } 

     protected override bool TypesMatch(Type sourceType, Type targetType) 
     { 
      return sourceType == typeof(string) && targetType.IsEnum; 
     } 

     protected override object SetValue(object sourcePropertyValue) 
     { 
      return Enum.Parse(TargetPropType, sourcePropertyValue.ToString().Replace(" ", ""), true); 
     } 
    } 

    public enum Country 
    { 
     UnitedStates = 1, 
     NewZealand = 2 
    } 


    public enum Gender 
    { 
     Male, 
     Female, 
     Unknown 
    } 
} 

également dans le cas où vous devez le faire de CountryRaw à MappedCountry vous pourriez le faire comme ceci:

oo.InjectFrom(new StrRawToEnum().TargetPrefix("Mapped"), o); 
+2

, mon ami, est une solution très propre! Merci :-). – 6footunder