15

我正在创建一个简单的 MVC4 应用程序

我有一个自动映射器

 Mapper.CreateMap<SourceClass, DestinationClass>()
      .ForMember(dest => dest.IntphoneNo, 
                  opt => opt.MapFrom(src => src.Stringphoneno));

IntphoneNo是 DataType int(IntphoneNo 是我的类的一个变量Person) 源属性Stringphoneno是 Datatype字符串

当我映射时,我得到以下错误。

AutoMapper.dll 中出现“AutoMapper.AutoMapperMappingException”类型的异常,但未在用户代码中处理

但是当我将 IntphoneNo 的Dataypeint更改为string时 ,我的程序运行成功。

不幸的是,我无法更改模型中的数据类型

有什么方法可以更改映射中的 Datatupe .. 如下所示

.ForMember(dest => dest.IntphoneNo, 
                  opt => opt.MapFrom(src => src.Int32(Stringphoneno));

经过一番研究,我更进一步..
如果我的 StringPhoneNo 是 = 123456
,那么下面的代码就可以工作了。我不需要将其解析为字符串

Mapper.CreateMap<SourceClass, DestinationClass>()
      .ForMember(dest => dest.IntphoneNo, 
                  opt => opt.MapFrom(src => src.Stringphoneno));

但是当我的 StringPhoneNo 为 = 12 3456 ( 12 之后有一个空格)时,我的代码不起作用。有什么方法可以在 automapper.xml 中修剪 Stringphoneno 中的空格(从 web 服务获取的 Stringphoneno)。

像下面的东西..

Mapper.CreateMap<SourceClass, DestinationClass>()
      .ForMember(dest => dest.IntphoneNo, 
                  opt => opt.MapFrom(src => src.Trim(Stringphoneno))); 
4

4 回答 4

22
Mapper.CreateMap<SourceClass, DestinationClass>() 
    .ForMember(dest => dest.IntphoneNo, 
        opt => opt.MapFrom(src => int.Parse(src.Stringphoneno)));

这是使用所描述的地图的一些示例工作代码

class SourceClass
{
    public string Stringphoneno { get; set; }
}

class DestinationClass
{
    public int IntphoneNo { get; set; }
}

var source = new SourceClass {Stringphoneno = "8675309"};
var destination = Mapper.Map<SourceClass, DestinationClass>(source);

Console.WriteLine(destination.IntphoneNo); //8675309
于 2013-09-12T14:46:58.050 回答
12

您可能面临的问题是当它无法解析字符串时,一种选择是使用 ResolveUsing:

Mapper.CreateMap<SourceClass, DestinationClass>() 
.ForMember(dest => dest.intphoneno, opts => opts.ResolveUsing(src =>
                double.TryParse(src.strphoneno, out var phoneNo) ? phoneNo : default(double)));
于 2017-02-26T21:06:47.537 回答
2

Yuriy Faktorovich的解决方案可以通过定义一些自定义属性的扩展方法和使用来推广到所有string应该转换为s 的 s :intIMappingExpression

[AttributeUsage(AttributeTargets.Property)]
public class StringToIntConvertAttribute : Attribute
{
}

// tries to convert string property value to integer
private static int GetIntFromString<TSource>(TSource src, string propertyName)
{
    var propInfo = typeof(TSource).GetProperty(propertyName);
    var reference = (propInfo.GetValue(src) as string);
    if (reference == null)
        throw new MappingException($"Failed to map type {typeof(TSource).Name} because {propertyName} is not a string);

    // TryParse would be better
    var intVal = int.Parse(reference);
    return intVal;
}

public static IMappingExpression<TSource, TDestination> StringToIntMapping<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var srcType = typeof(TSource);
    foreach (var property in srcType.GetProperties().Where(p => p.GetCustomAttributes(typeof(StringToIntConvertAttribute), inherit: false).Length > 0))
    {
        expression.ForMember(property.Name, opt => opt.MapFrom(src => GetIntFromString(src, property.Name)));
    }

    return expression;
}

为了使这项工作,必须执行以下步骤:

  1. 源和目标之间的映射必须附加映射扩展。例如:

    var config = new MapperConfiguration(cfg =>
    {
       // other mappings
    
       cfg.CreateMap<SrcType, DestType>().StringToIntMapping();
    });
    
  2. 将该属性应用于必须自动转换为整数值的所有源字符串属性

于 2016-12-08T13:12:25.120 回答
0

这是一种更简单但扩展性较差的方法。每当你调用 Mapper.Initialize 时,记得调用 .ToInt() 否则你会得到一个运行时错误。

public class NumberTest
{
    public static void Main(string[] args)
    {
        Console.WriteLine("".ToInt());
        // 0
        Console.WriteLine("99".ToInt());
        // 99
    }
}

public static class StringExtensions
{
    public static int ToInt(this string text)
    {
        int num = 0;
        int.TryParse(text, out num);
        return num;
    }
}

// Use like so with Automapper
.ForMember(dest => dest.WidgetID, opts => opts.MapFrom(src => src.WidgetID.ToInt()));
于 2017-04-19T14:46:42.830 回答