AutoMapper 无法使用转换器映射可为空的值
AutoMapper can't map nullable values with a converter
我有以下两个POCO:
private class Person
{
public string Name { get; set; }
public int? Age { get; set; }
}
private class PersonDto
{
public string Name { get; set; }
public int? Age { get; set; }
}
在我的应用程序中,我想实现标准行为,即空值在映射它们时不会覆盖它们的目标。这是我尝试执行的代码:
var mapper = new MapperConfiguration(m =>
{
m.CreateMap<Person, PersonDto>().ReverseMap();
m.CreateMap(typeof(Nullable<>), typeof(Nullable<>)).ConvertUsing(typeof(NullableConverter<>));
}).CreateMapper();
var person = new Person
{
Name = "Steve",
Age = null
};
var personDto = new PersonDto
{
Name = "Steve",
Age = 20
};
var result = mapper.Map(person, personDto);
Console.WriteLine(personDto.Age);
我希望语句 Console.WriteLine(personDto.Age);
打印 20
。 NullableConverter
实现如下:
public class NullableConverter<TSource> : ITypeConverter<TSource, TSource>
{
public TSource Convert(TSource source, TSource destination, ResolutionContext context)
{
return source == null ? destination : source;
}
}
相反,关于 Age
属性 的映射,我遇到了以下异常:
System.InvalidCastException: Unable to cast object of type 'Test.NullableConverter´1[System.Int32]' to type 'AutoMapper.ITypeConverter´2[System.Nullable´1[System.Int32],System.Nullable´1[System.Int32]]'
。这对我来说没有意义。为什么 AutoMapper 会尝试将 NullableConverter<int>
分配给 ITypeConverter<int?, int?>
。很明显,这是行不通的。它不应该尝试使用 NullableConverter<int?>
吗?这似乎是错误的行为。我错过了什么吗?
我正在使用 AutoMapper v10
直接在转换器上指定 Nullable
(?
):
public class NullableConverter<TSource> : ITypeConverter<TSource?, TSource?> where TSource: struct
{
public TSource? Convert(TSource? source, TSource? destination, ResolutionContext context)
{
return source.HasValue ? source : destination ;
}
}
此外,如果您想忽略所有空源成员,您可以执行类似 .
的操作
我有以下两个POCO:
private class Person
{
public string Name { get; set; }
public int? Age { get; set; }
}
private class PersonDto
{
public string Name { get; set; }
public int? Age { get; set; }
}
在我的应用程序中,我想实现标准行为,即空值在映射它们时不会覆盖它们的目标。这是我尝试执行的代码:
var mapper = new MapperConfiguration(m =>
{
m.CreateMap<Person, PersonDto>().ReverseMap();
m.CreateMap(typeof(Nullable<>), typeof(Nullable<>)).ConvertUsing(typeof(NullableConverter<>));
}).CreateMapper();
var person = new Person
{
Name = "Steve",
Age = null
};
var personDto = new PersonDto
{
Name = "Steve",
Age = 20
};
var result = mapper.Map(person, personDto);
Console.WriteLine(personDto.Age);
我希望语句 Console.WriteLine(personDto.Age);
打印 20
。 NullableConverter
实现如下:
public class NullableConverter<TSource> : ITypeConverter<TSource, TSource>
{
public TSource Convert(TSource source, TSource destination, ResolutionContext context)
{
return source == null ? destination : source;
}
}
相反,关于 Age
属性 的映射,我遇到了以下异常:
System.InvalidCastException: Unable to cast object of type 'Test.NullableConverter´1[System.Int32]' to type 'AutoMapper.ITypeConverter´2[System.Nullable´1[System.Int32],System.Nullable´1[System.Int32]]'
。这对我来说没有意义。为什么 AutoMapper 会尝试将 NullableConverter<int>
分配给 ITypeConverter<int?, int?>
。很明显,这是行不通的。它不应该尝试使用 NullableConverter<int?>
吗?这似乎是错误的行为。我错过了什么吗?
我正在使用 AutoMapper v10
直接在转换器上指定 Nullable
(?
):
public class NullableConverter<TSource> : ITypeConverter<TSource?, TSource?> where TSource: struct
{
public TSource? Convert(TSource? source, TSource? destination, ResolutionContext context)
{
return source.HasValue ? source : destination ;
}
}
此外,如果您想忽略所有空源成员,您可以执行类似