我无法使用AutoMapper将API中的字符串锥化为枚举



我正在尝试使用AutoMapper将字符串从API TryParse到Enum,如果无法解析,他应该返回一个;默认值";。我的模型是:Class Expense

public long Id { get; set; }
public string Description { get; set; }
public double Value { get; set; }
public DateTime Date { get; set; }
public Category Categories { get; set; }

我的DTO是:Class ExpenseDTO

public long Id { get; set; }
public string Description { get; set; }
public double Value { get; set; }
public DateTime Date { get; set; }
public string Categories { get; set; }

枚举包含:

public enum Category : int {
Others = 0,
Food = 1,
Health = 2,
Home = 3,
Transport = 4,
Education = 5,
Chill = 6,
Unexpected = 7
}

我已经尝试了在StackOverFlow上看到的一个解决方案,它是:

CreateMap<ExpenseDTO, Expense>()
.ForMember(dest => dest.Category,
opt =>
{
object? parsedResult;
opt.MapFrom(src =>
Enum.TryParse(typeof(Category), src.Categories, true, out parsedResult) ? parsedResult : Category.Others);
})
.ReverseMap().ForMember(dest => dest.Category,
opt => opt.MapFrom(src => src.Categories.ToString()));

当我试图发送一个不存在的类别(如";测试";。API返回错误:

Mapping types:
ExpenseDTO -> Expense
Challenge.API.ExpenseDTO -> Challenge.Domain.Expense

Type Map configuration:
ExpenseDTO -> Expense
Challenge.API.ExpenseDTO -> Challenge.Domain.Expense

有人能帮我吗?

如果您需要比简单src更复杂的东西。字段=>dest。字段类型映射,您可以使用值解析器插入自定义逻辑,如下所示:

public class CategoriesEnumValueResolver : IValueResolver<ExpenseDTO, Expense, Category>
{
public Category Resolve(ExpenseDTO source, Expense destination, Category destMember, ResolutionContext context)
{
if (Enum.TryParse<Category>(source.Categories, out var category))
return category;
return Category.Others;
}
}

然后,您告诉AutoMapper在创建地图时使用该值解析程序:

CreateMap<ExpenseDTO, Expense>()
.ForMember(m => m.Categories, opt => opt.MapFrom<CategoriesEnumValueResolver>());

最新更新