当从字符串映射到int类型属性时,我如何在automapper中设置默认值为异常

本文关键字:automapper 设置 异常 默认值 映射 字符串 int 属性 类型 | 更新日期: 2023-09-27 18:13:31

我试图将一个对象映射到另一个对象,但我在将空字符串映射到类型int或非整数字符串到int时遇到了问题,所以我想要的是,如果我发生这种异常,它必须分配一些默认值给它,让我们说-1。

例如,我们有A类和B
 Class A
 {
     public string a{get;set;}
 }
 Class B
 {
     public int a{get;set;}
 }

现在,如果我们使用默认规则从A类映射到B,如果字符串为空或非整数,则会通过异常。

请帮我解决这个问题。

当从字符串映射到int类型属性时,我如何在automapper中设置默认值为异常

我想这就是你想要的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using NUnit.Framework;
namespace StackOverFlowAnswers
{
    public class LineItem
    {
        public int Id { get; set; }
        public string ProductId { get; set; }
        public int Amount { get; set; }
    }
    public class Model
    {
        public int Id { get; set; }
        public string ProductId { get; set; }
        public string Amount { get; set; }
    }

    public class AutoMappingTests
    {
        [TestFixtureSetUp]
        public void TestFixtureSetUp()
        {
            Mapper.CreateMap<Model, LineItem>()
                  .ForMember(x => x.Amount, opt => opt.ResolveUsing<StringToInteger>());
        }
        [Test]
        public void TestBadStringToDefaultInteger()
        {
            // Arrange
            var model = new Model() {Id = 1, ProductId = "awesome-product-133-XP", Amount = "EVIL STRING, MWUAHAHAHAH"};
            // Act
            LineItem mapping1 = Mapper.Map<LineItem>(model);
            // Assert
            Assert.AreEqual(model.Id, mapping1.Id);
            Assert.AreEqual(model.ProductId, mapping1.ProductId);
            Assert.AreEqual(0, mapping1.Amount);

            // Arrange
            model.Amount = null; // now we test null, which we said in options to map from null to -1
            // Act
            LineItem mapping2 = Mapper.Map<LineItem>(model);
            // Assert
            Assert.AreEqual(-1, mapping2.Amount);
        }
    }
    public class StringToInteger : ValueResolver<Model, int>
    {
        protected override int ResolveCore(Model source)
        {
            if (source.Amount == null)
            {
                return -1;
            }
            int value;
            if (int.TryParse(source.Amount, out value))
            {
                return value; // Wahayy!!
            }
            return 0; // return 0 if it could not parse!
        }
    }
}

当我分享我自己制作的代码时,上面的代码也可以工作

public class StringToIntTypeConverter : ITypeConverter<string, int>
{
    public int Convert(ResolutionContext context)
    {
        int result;
        if (!int.TryParse(context.SourceValue.ToString(), out result))
        {
            result = -1;
        };
        return result;
    }
}