我使用Automapper将数据表转换为泛型类型。这是我的代码
public T MapTo<T>(DataTable table)
{
if (table == null || table.Rows.Count == 0)
{
return default(T);
}
else
{
return (T)Convert.ChangeType(AutoMapper.Mapper.DynamicMap<IDataReader, List<T>>(table.CreateDataReader())[0], typeof(T));
}
}
我的数据表有13列,我将其映射到的类型也是如此,但是我仍然在上面的else块中收到错误:
&#34;消息&#34;:&#34;发生了错误。&#34;, &#34; ExceptionMessage&#34;:&#34;索引超出范围。必须是非负数且小于集合的大小。\ r \ nParameter name:index&#34;, &#34; ExceptionType&#34;:&#34; System.ArgumentOutOfRangeException&#34;, &#34; StackTrace&#34;:&#34; at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument参数,ExceptionResource资源)\ r \ n在System.Collections.Generic.List`1.get_Item(Int32 index)\ r \ n at MySolution.GenericMap.MapTo [T](DataTable table)
可能有什么不对?我使用的是Automapper 4.1.1.0和.Net 4.5
答案 0 :(得分:0)
在Automapper版本4.0.0+中似乎已被打破(参见bug report)
此链接bug report建议降级到3.3.1版或使用以下过程:
应该有DataReaderMapper。我从DataReaderMapper(从版本3.1)中提取了一个旧版本并注册了它,现在它可以工作。
注册Mapper:
MapperRegistry.Mappers.Add(new DataReaderMapper());
DataReaderMapper代码:
https://github.com/AutoMapper/AutoMapper/blob/v3.3.1/src/AutoMapper/Mappers/DataReaderMapper.cs
必须更改以下代码:
TypeMap typeMap = configurationProvider.FindTypeMapFor(context.SourceValue, context.DestinationValue, context.SourceType, destinationElementType);
新守则:
Map typeMap = configurationProvider.FindTypeMapFor(context.SourceType, destinationElementType);
和
if (context.TypeMap == null) { throw new AutoMapperMappingException(context, "Missing type map configuration or unsupported mapping."); }
要
if (context.TypeMap == null) { return; }
虽然前面的过程有效,但bug report也链接到nuget package,其中包含旧DataReaderMapper的代码,但它在我的机器上不能与DynamicMap一起使用。