基于自动映射的从Datatable转换为泛型类型无法正常工作

时间:2016-01-11 16:18:19

标签: c# .net generics .net-4.5 automapper

我使用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

1 个答案:

答案 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一起使用。