为每个枚举创建ITypeConverter

时间:2015-02-22 21:48:02

标签: c# .net converter automapper-3

所以,基本上我尝试创建一个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>();
                });
        }
    }

0 个答案:

没有答案