使用csvHelper时,出现“没有为该类型映射任何属性”的问题

13

我有以下的类

public class EventObject
{
    public int OrderID { get; private set; }
    public int DemandID { get; private set; }
    public string ExternalEventID { get; private set; }
    public int Part { get; private set; }
    public int BasedOnObjectID { get; private set; }
    public int BasedOnStateID { get; private set; }
    public DateTime StartDate { get; private set; }
    public DateTime EndDate { get; private set; }
    public int? EventID { get; private set; }

    public static IEnumerable<EventObject> LoadFromCSV(TextReader reader)
    {
        var plannedEventsToReturn = new List<EventObject>();
        var csv = new CsvReader(reader);
        csv.Configuration.RegisterClassMap<EventObjectMap >();
        return csv.GetRecords<EventObject>().ToList();
    }
}

我已经创建了一个映射类,就像在csvHelper中所述。

public sealed class EventObjectMap : CsvClassMap<EventObject>
{
    public EventObjectMap ()
    {
        Map(m => m.OrderID).Index(0);
        Map(m => m.DemandID).Index(1);
        Map(m => m.ExternalEventID).Index(2);
        Map(m => m.Part).Index(3);
        Map(m => m.BasedOnObjectID).Index(4);
        Map(m => m.BasedOnStateID).Index(5);
        Map(m => m.StartDate).Index(6).TypeConverter<OptimizationDateTimeConverter>();
        Map(m => m.EndDate).Index(7).TypeConverter<OptimizationDateTimeConverter>();
        Map(m => m.EventID).Index(8).TypeConverter<NullableIntConverter>();
    }
}

当我到达终点线时

return csv.GetRecords<EventObject>().ToList();

我遇到了一个异常

没有为此类型映射任何属性


2
即使使用公共属性,我仍然会遇到这个问题。 - user3791372
4个回答

16

找到问题了...属性有私有设置..它们需要像这样公开

public int OrderID { get; set; }
public int DemandID { get; set; }
public string ExternalEventID { get; set; }
public int Part { get;  set; }
public int BasedOnObjectID { get; set; }
public int BasedOnStateID { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int? EventID { get; set; }

9

接受的答案已经正确地解决了问题,但还有另一种解决方法如下所示:

CsvConfiguration configuration = new CsvConfiguration
{
   IgnorePrivateAccessor = true,
}

CsvReader reader = new CsvReader(/*your TextReader*/, configuration);

文档

获取或设置一个值,指示是否应从和写入到私有成员。True 包括私有成员,否则为 false。默认值为 false。

注意:即使您具有 internal 属性,也可能会遇到相同的问题。

internal int OrderID { get; set; }

对于该库的新版本,似乎该属性的名称已更改为IncludePrivateMembers


2
这个问题还有另一种解决方法:
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;

对我来说情况可能略有不同,因为我使用的是字段而不是属性,但是出现了相同的错误消息,所以...


1
现在您可以使用IncludePrivateMembers属性。
using CsvHelper;
using System.IO;
using System.Linq;
using Xunit;

namespace UseIncludePrivateMembers
{
    public class Stub
    {
        public double Value1 { get; private set; }
        public double Value2 { get; private set; }
    }

    public class Tests
    {
        [Fact]
        public void Test()
        {
            using (var stream = new MemoryStream())
            using (var writer = new StreamWriter(stream))
            using (var reader = new StreamReader(stream))
            using (var csv = new CsvReader(reader))
            {
                writer.WriteLine("Value1,Value2");
                writer.WriteLine("5,6");
                writer.Flush();
                stream.Position = 0;

                csv.Configuration.IncludePrivateMembers = true;
                var record = csv.GetRecords<Stub>().First();

                Assert.Equal(5, record.Value1);
                Assert.Equal(6, record.Value2);
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接