0

したがって、基本的に、列挙型マッピングで実行される TypeConverter を作成しようとしています。次のコード内のコメントは、私が現在抱えている問題を説明しています。

  • 文字列から Enum へのマップを行うと、TypeConverter が実行されます。
  • 文字列から状態(列挙) へのマップを行うと、TypeConverter は実行されません。

特定の列挙マッピング中に TypeConverter を実行できる唯一の方法は、名前空間内のすべての列挙のマップを作成するときです (CreateMapForEveryEnum() メソッド)。ただし、もちろん、リフレクションの使用はパフォーマンスに悪いため、避ける必要があります。

    using System;
    using System.Linq;
    using System.Reflection;

    using AutoMapper;

    public class Program
    {
        public static void Main(string[] args)
        {
            Mapper.CreateMap<string, Enum>().ConvertUsing<EnumConverter>();

            // call enum converter
            var enumeration1 = Mapper.Map<Enum>("0");
            Console.WriteLine(enumeration1.ToString());

            // dont call enum converter
            var enumeration2 = Mapper.Map<State>("0");
            Console.WriteLine(enumeration2.ToString());

            // create map for every enum inside the current namespace
            CreateMapForEveryEnum();

            // now calls enum converter
            var enumeration3 = Mapper.Map<State>("0");
            Console.WriteLine(enumeration3.ToString());

            Console.ReadLine();
        }

        public enum State
        {
            Active,
            Inactive,
            Idle,
        }

        public enum Test
        {

        }'

        public class EnumConverter : ITypeConverter<string, Enum>
        {
            public Enum Convert(ResolutionContext context)
            {
                return State.Idle;
            }
        }

        private static void CreateMapForEveryEnum()
        {
            const string @namespace = "AutoMapperITypeConverterTest";

            var q = from t in Assembly.GetExecutingAssembly().GetTypes()
                    where t.IsEnum && t.Namespace == @namespace
                    select t;
            q.ToList().ForEach(
                t =>
                {
                    Console.WriteLine("Enum type: " + t.Name);
                    Mapper.CreateMap(typeof(string), t).ConvertUsing<EnumConverter>();
                });
        }
    }
4

0 に答える 0