Создание карт из коллекции Dynami c больше не работает: невозможно преобразовать объект типа System.String в System.Object) - PullRequest
0 голосов
/ 14 апреля 2020

Мы переносим унаследованный код в соответствии со стандартом tnet и столкнулись с проблемой, которой [я считаю] не было в 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};
}
* * +1007 сообщает об ошибке:

метод испытания CsvHelper.Tests.CsvReaderMappingTestsRuslan.CanCreateMapsFromDynamicList выбросил исключение: System.InvalidCastException: Не удалось привести объект типа «CsvHelper.Configuration.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType, System.String] для ввода типа CsvHelper.Configuration.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType, System.Object] '.

PS Я попытался изменить свойство «Сопоставления» до c и получить тот же результат.

1 Ответ

0 голосов
/ 20 апреля 2020

разрешено путем добавления этого метода перегрузки:

    public virtual MemberMap Map<T>( Expression<Func<T, object>> expression, bool useExistingMap = true )
    {
        var stack = ReflectionHelper.GetMembers(expression);
        if (stack.Count == 0)
        {
            throw new InvalidOperationException("No members were found in expression '{expression}'.");
        }

        ClassMap currentClassMap = this;
        MemberInfo member;

        if (stack.Count > 1)
        {
            // We need to add a reference map for every sub member.
            while (stack.Count > 1)
            {
                member = stack.Pop();
                Type mapType;
                var property = member as PropertyInfo;
                var field = member as FieldInfo;
                if (property != null)
                {
                    mapType = typeof(DefaultClassMap<>).MakeGenericType(property.PropertyType);
                }
                else if (field != null)
                {
                    mapType = typeof(DefaultClassMap<>).MakeGenericType(field.FieldType);
                }
                else
                {
                    throw new InvalidOperationException("The given expression was not a property or a field.");
                }

                var referenceMap = currentClassMap.References(mapType, member);
                currentClassMap = referenceMap.Data.Mapping;
            }
        }

        // Add the member map to the last reference map.
        member = stack.Pop();

        return currentClassMap.Map( typeof(TClass), member, useExistingMap );
    }

PR повышен https://github.com/JoshClose/CsvHelper/pull/1505

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...