AutoMapper字符串以枚举描述

时间:2010-08-11 20:14:30

标签: enums automapper valueinjecter

鉴于要求:

获取对象图,根据第二个字符串属性的已处理值设置所有枚举类型属性。约定规定源字符串属性的名称将是具有后缀“Raw”的枚举属性的名称。

通过处理我们意味着我们需要剥离指定的字符e.t.c。

我看过自定义格式化程序,值解析器和类型转换器,这些都不是解决方案吗?

我们希望使用AutoMapper而不是我们自己的反射例程,原因有两个:a)它在项目的其余部分广泛使用,b)它为您提供递归遍历ootb。

- 示例 -

鉴于下面的(简单)结构,以及:

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

var tmp2 = new SimpleClass();

Mapper.Map(tmp, tmp2);

我们希望tmp2的MappedCountry枚举为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 个答案:

答案 0 :(得分:5)

我用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);