C# 数据表可为空<;布尔>;对于Automapper和DynamicMap,指定的强制转换无效
我伤脑筋已经有一段时间了,我好像没法让它起作用 测试类别:C# 数据表可为空<;布尔>;对于Automapper和DynamicMap,指定的强制转换无效,c#,datatable,automapper,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; } } 公共类Sou
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
{
公共int ID{get;set;}
公共Int32 BVAL{get;set;}
}
公共类目的测试
{
公共int ID{get;set;}
公共可空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
SourceTest t=newsourcetest();
t、 ID=1;
t、 BVAL=1;
AutoMapper.Mapper.CreateMap();
AutoMapper.Mapper.AssertConfigurationsValid();
DestinationTest dest_test=AutoMapper.Mapper.Map(t);
布尔?dest test=dest_test.BVAL//真的
这不起作用:
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;
DataTable tdt=newdatatable();
添加(“ID”,typeof(Int32));
tdt.Columns.Add(“BVAL”,typeof(Int32));
Add(新对象[]{1,1});
List t2=AutoMapper.Mapper.DynamicMap(tdt.CreateDataReader())//异常:{“指定的强制转换无效。”}
布尔?bt=t2[0].BVAL;
但是,如果目的地如下所示,则它可以工作:
public class DestinationTest
{
public int ID { get; set; }
public Nullable<int> BVAL { get; set; }
}
公共类DestinationTest
{
公共int ID{get;set;}
公共可空BVAL{get;set;}
}
然而,这自然违背了目的
关于为什么Dynamicmap不想转换为可为null的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;
}
}
}
私有类NullBooleanTypeConverter:AutoMapper.TypeConverter
{
受保护的重写可为空的ConvertCore(Int32源)
{
if(source==null)
返回null;
其他的
{
返回源!=0;
}
}
}
在尝试转换之前,我几乎肯定会告诉Automapper有关转换器的信息:
AutoMapper.Mapper.CreateMap<Int32, Nullable<bool>>( ).ConvertUsing<NullBooleanTypeConverter>( );
AutoMapper.Mapper.CreateMap().ConvertUsing();
如果我尝试调试,似乎从未使用过转换器
我不知道如何继续。我在github页面上问了同样的问题: github.com/AutoMapper/AutoMapper/issues/454 目前似乎没有办法做到这一点。答案是: 数据读取器映射中不使用转换器和解析器,这些 通过一条完全独立的管道。转换类型并不重要 此版本中支持 好了