如何在 C# 中根据名称映射 2 个枚举?
How to map 2 Enums based on name in C#?
假设我有 2 个枚举:
public enum TimeLine: short
{
Day = 1,
Week = 2,
Month = 3,
Year = 4,
}
和:
public enum TimeLine2: short
{
Day = 2,
Week = 1,
Month = 3,
Year = 4,
}
如何映射这 2 个枚举,以便在我使用 TimeLine.Day
时得到“1”而不是“2”?
我们目前的解决方案是使用带有 switch 语句的 convert 方法,但随着时间的推移它变得越来越大和复杂。
你可以使用 Enum.TryParse<T>
:
public static TimeLine2? MapByName(TimeLine1 tl)
=> Enum.TryParse<TimeLine2>(tl.ToString(), out var tl2) ? tl2 : null;
这有点像“用大锤敲坚果”,但是您可以使用AutoMapper
来做到这一点。
我不会使用 AutoMapper
除非我已经将它用于其他更困难的映射,但这里是您可以使用它的方法。
(您需要为此添加“AutoMapper.Extensions.EnumMapping”NuGet 包)
using System;
using AutoMapper;
using AutoMapper.Extensions.EnumMapping;
static class Program
{
public enum TimeLine1 : short
{
Day = 1,
Week = 2,
Month = 3,
Year = 4,
}
public enum TimeLine2 : short
{
Day = 2,
Week = 1,
Month = 3,
Year = 4,
}
public static void Main()
{
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<TimeLine1, TimeLine2>()
.ConvertUsingEnumMapping(opt => opt.MapByName()));
var mapper = new Mapper(config);
TimeLine1 t1 = TimeLine1.Day;
TimeLine2 t2 = mapper.Map<TimeLine2>(t1);
Console.WriteLine(t2); // Outputs "Day", not "Week" (which a value-based mapping would result in).
}
}
假设我有 2 个枚举:
public enum TimeLine: short
{
Day = 1,
Week = 2,
Month = 3,
Year = 4,
}
和:
public enum TimeLine2: short
{
Day = 2,
Week = 1,
Month = 3,
Year = 4,
}
如何映射这 2 个枚举,以便在我使用 TimeLine.Day
时得到“1”而不是“2”?
我们目前的解决方案是使用带有 switch 语句的 convert 方法,但随着时间的推移它变得越来越大和复杂。
你可以使用 Enum.TryParse<T>
:
public static TimeLine2? MapByName(TimeLine1 tl)
=> Enum.TryParse<TimeLine2>(tl.ToString(), out var tl2) ? tl2 : null;
这有点像“用大锤敲坚果”,但是您可以使用AutoMapper
来做到这一点。
我不会使用 AutoMapper
除非我已经将它用于其他更困难的映射,但这里是您可以使用它的方法。
(您需要为此添加“AutoMapper.Extensions.EnumMapping”NuGet 包)
using System;
using AutoMapper;
using AutoMapper.Extensions.EnumMapping;
static class Program
{
public enum TimeLine1 : short
{
Day = 1,
Week = 2,
Month = 3,
Year = 4,
}
public enum TimeLine2 : short
{
Day = 2,
Week = 1,
Month = 3,
Year = 4,
}
public static void Main()
{
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<TimeLine1, TimeLine2>()
.ConvertUsingEnumMapping(opt => opt.MapByName()));
var mapper = new Mapper(config);
TimeLine1 t1 = TimeLine1.Day;
TimeLine2 t2 = mapper.Map<TimeLine2>(t1);
Console.WriteLine(t2); // Outputs "Day", not "Week" (which a value-based mapping would result in).
}
}