5

鉴于要求:

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

通过处理我们的意思是我们需要去除指定的字符等

我查看了自定义格式化程序、值解析器和类型转换器,但似乎没有一个可以解决这个问题?

我们希望使用 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
}

谢谢

4

1 回答 1

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);
于 2010-08-12T10:00:38.913 回答