5

要件を考えると:

オブジェクト グラフを取得し、2 番目の文字列プロパティの処理された値に基づいてすべての列挙型プロパティを設定します。ソース文字列プロパティの名前は、"Raw" の接尾辞が付いた enum プロパティの名前になることが規則で定められています。

処理されるとは、指定された文字などを取り除く必要があることを意味します

カスタムフォーマッター、値リゾルバー、型コンバーターを見てきましたが、どれもこれに対する解決策のようには見えませんか?

独自のリフレクション ルーチンとは対照的に AutoMapper を使用したい理由は 2 つあります。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 にもう 1 つの props を追加しました。

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 に答える