代码之家  ›  专栏  ›  技术社区  ›  Ruslan

从动态集合创建映射不再有效:无法强制转换类型为的对象系统字符串到系统对象)

  •  0
  • Ruslan  · 技术社区  · 6 年前

    我们正在将遗留代码移植到dotnet标准中,并且正面临一个在csvhelper2.5.0net451中不存在的问题。

    问题似乎是CsvReader无法解决映射中底层属性的正确ReturnType,并试图将它们全部映射到系统对象

    [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.CanCreateMapsFromDynamicist 引发异常:System.InvalidCastException:无法转换的对象 类型 键入

    P、 我尝试过将“Mappings”属性更改为static并得到相同的结果。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Ruslan    6 年前

        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

    推荐文章