Csvhelper: 从动态集合创建映射不再起作用:无法将类型为System.String的对象转换为System.Object)

创建于 2020-04-14  ·  3评论  ·  资料来源: JoshClose/CsvHelper

嗨,我们正在将遗留代码移植到dotnet标准,并且遇到了CsvHelper 2.5.0 net451中没有的问题。

问题似乎是CsvReader无法设法解决映射中正确的ReturnType基础属性,并试图将它们全部映射到System.Object

我设法通过您的解决方案中的单元测试来重现它:


[TestMethod]
public void CanCreateMapsFromDynamicList()
{
    var data = new List<string[]>
    {
        new[] { "Col1", "Col2" },
        new[] { "1", "one" },
        new[] { "2", "two" }
    };

    var queue = new Queue<string[]>(data);
    var parserMock = new ParserMock(queue);

    var csvReader = new CsvReader(parserMock);
    csvReader.Configuration.RegisterClassMap<SomeTypeClassMap>();

    var records = csvReader.GetRecords<SomeType>().ToList();

    Assert.IsNotNull(records);
    Assert.AreEqual(2, records.Count);

}

public class SomeTypeClassMap : ClassMap<SomeType>
{
    public SomeTypeClassMap()
    {
        Map(x => x.Id).Ignore();
        var t = new SomeType();

        foreach (var mapping in t.Mappings)
        {
            Map(mapping);
        }
    }
}

public class SomeType
{
    public int Id { get; set; }
    public string Col1 { get; set; }
    public string Col2 { get; set; }

    public IEnumerable<Expression<Func<SomeType, dynamic>>> Mappings =>
        new List<Expression<Func<SomeType, dynamic>>> {i => i.Col1, i => i.Col2};
}

错误报告:

测试方法CsvHelper.Tests.CsvReaderMappingTestsRuslan.CanCreateMapsFromDynamicList抛出异常:
System.InvalidCastException:无法转换类型为'CsvHelper.Configuration.MemberMap 2[CsvHelper.Tests.CsvReaderMappingTestsRuslan+SomeType,System.String]' to type 'CsvHelper.Configuration.MemberMap 2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.Object]'的对象。

最有用的评论

看起来Map上的签名已更改。 现在,它需要实际的成员类型作为通用成员,而不是object

也许还有另一种解决方法。 您这样做的目的是什么?

感谢您的提示! 我已经解决了这个问题并提出了拉取请求: https :

所有3条评论

看起来Map上的签名已更改。 现在,它需要实际的成员类型作为通用成员,而不是object

也许还有另一种解决方法。 您这样做的目的是什么?

我们的用例是这样的:我们导入一堆不同的CSV文档,所有这些文档都有一组包含在基类中的公共属性(列),并在每个相应的实体类中定义了一些个体。 这种设计使我们可以在升级之前对所有这些函数使用单个ClassMap函数。 您是否认为可能有一个简单的解决方法?

看起来Map上的签名已更改。 现在,它需要实际的成员类型作为通用成员,而不是object

也许还有另一种解决方法。 您这样做的目的是什么?

感谢您的提示! 我已经解决了这个问题并提出了拉取请求: https :

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

DmitryEfimenko picture DmitryEfimenko  ·  3评论

mabead picture mabead  ·  3评论

JoshClose picture JoshClose  ·  4评论

malinru picture malinru  ·  5评论

dsotiriades picture dsotiriades  ·  3评论