使用Automapper和DynamicMap指定的强制转换为Nullable <bool>的数据表无效</bool>

时间:2014-01-23 13:38:04

标签: c# datatable automapper

我现在一直在骂我的脑袋,我似乎无法让它发挥作用。

测试类:

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>( );

如果我尝试调试,似乎从未使用转换器。

我不知道如何继续。

1 个答案:

答案 0 :(得分:1)

我在github页面上问了同样的问题: github.com/AutoMapper/AutoMapper/issues/454

似乎目前无法做到这一点。答案是:

  

转换器和解析器不会用在数据读取器映射中   通过完全独立的管道。转换类型不是   此版本支持。

所以你有它。