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