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

问题描述 投票:0回答:1

我们正在将遗留代码移植到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.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.String]'输入'CsvHelper.Configuration.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.Object]'。

P.S。我尝试将“映射”属性更改为静态并获得相同的结果。

我们正在将遗留代码移植到dotnet标准,并且遇到了[我认为] CsvHelper 2.5.0 net451中没有的问题。问题似乎是CsvReader无法解决...

c# .net-standard csvhelper csvreader
1个回答
0
投票

通过添加此重载方法解决:

© www.soinside.com 2019 - 2024. All rights reserved.