我现在一直在骂我的脑袋,我似乎无法让它发挥作用。
测试类:
public class SourceTest
{
public int ID { get; set; }
public Int32 BVAL { get; set; }
}
public class DestinationTest
{
public int ID { get; set; }
public Nullable<bool> BVAL { get; set; }
}
这有效:
SourceTest t = new SourceTest( );
t.ID = 1;
t.BVAL = 1;
AutoMapper.Mapper.CreateMap<SourceTest, DestinationTest>( );
AutoMapper.Mapper.AssertConfigurationIsValid( );
DestinationTest dest_test = AutoMapper.Mapper.Map<SourceTest, DestinationTest>( t );
bool? desttest = dest_test.BVAL; //true
这不起作用:
DataTable tdt = new DataTable( );
tdt.Columns.Add( "ID", typeof( Int32 ) );
tdt.Columns.Add( "BVAL", typeof( Int32 ) );
tdt.Rows.Add( new object[] { 1, 1 } );
List<DestinationTest> t2 = AutoMapper.Mapper.DynamicMap<IDataReader, List<DestinationTest>>( tdt.CreateDataReader( ) );//Exception: {"Specified cast is not valid."}
bool? bt = t2[0].BVAL;
但是,如果目的地是这样的话,那就可以了:
public class DestinationTest
{
public int ID { get; set; }
public Nullable<int> BVAL { get; set; }
}
然而,这自然会使目的失败。
关于为什么Dynamicmap不想转换为可空bool的任何想法,而普通的映射工作正常?
编辑: 我已尝试过此代码的各种版本,但它也不起作用:
private class NullBooleanTypeConverter : AutoMapper.TypeConverter<In32, Nullable<bool>>
{
protected override Nullable<bool> ConvertCore( Int32 source )
{
if ( source == null )
return null;
else
{
return source != 0;
}
}
}
在尝试转换之前,我几乎要确保告诉Automapper转换器:
AutoMapper.Mapper.CreateMap<Int32, Nullable<bool>>( ).ConvertUsing<NullBooleanTypeConverter>( );
如果我尝试调试,似乎从未使用转换器。
我不知道如何继续。
答案 0 :(得分:1)
我在github页面上问了同样的问题: github.com/AutoMapper/AutoMapper/issues/454
似乎目前无法做到这一点。答案是:
转换器和解析器不会用在数据读取器映射中 通过完全独立的管道。转换类型不是 此版本支持。
所以你有它。