Строки AutoMapper для перечисления описаний - PullRequest
5 голосов
/ 12 августа 2010

Учитывая требование:

Возьмите граф объекта, задайте все свойства типа перечисления на основе значения обработанного свойства второй строки. Соглашение предписывает, что именем свойства строки источника будет имя свойства enum с постфиксом «Raw».

Под обработкой мы подразумеваем, что нам нужно будет удалить заданные символы, например,

Я смотрел на пользовательские средства форматирования, преобразователи значений и преобразователи типов, и ни один из них не кажется решением для этого?

Мы хотим использовать AutoMapper в отличие от нашей собственной процедуры отражения по двум причинам: а) он широко используется в остальной части проекта и б) он дает вам рекурсивный обходной поток.

- Пример -

Учитывая (простую) структуру ниже, и это:

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

var tmp2 = new SimpleClass();

Mapper.Map(tmp, tmp2);

мы ожидаем, что перечисление MampCountry в tmp2 будет иметь значение Country.UnitedStates, а свойство Person будет иметь пол 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
}

Спасибо

1 Ответ

5 голосов
/ 12 августа 2010

Я сделал это с ValueInjecter , вот и все:

Я добавил еще одну опору в SimpleClass, просто чтобы показать вам, как она работает

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
    }
}

также, если вам нужно сделать это из CountryRaw в MappedCountry, вы можете сделать это так:

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