したがって、基本的に、列挙型マッピングで実行される 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>();
});
}
}