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