0

所以,基本上我正在尝试创建一个 TypeConverter 以在任何枚举映射中运行。以下代码中的注释解释了我目前遇到的问题。

  • 如果我从字符串映射到枚举我的 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