【问题标题】:getting no properties are mapped for type using csvHelper使用 csvHelper 没有为类型映射属性
【发布时间】:2016-05-30 08:37:45
【问题描述】:

我有以下课程

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();

我得到一个例外

没有为类型映射属性

【问题讨论】:

  • 即使使用公共属性我也能理解

标签: csvhelper


【解决方案1】:

发现问题.. 属性有一个私有集.. 他们需要像这样公开..

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; }

【讨论】:

    【解决方案2】:

    因此,当接受的答案正常工作时,还有另一种方法可以解决此问题,如下所示

    CsvConfiguration configuration = new CsvConfiguration
    {
       IgnorePrivateAccessor = true,
    }
    
    CsvReader reader = new CsvReader(/*your TextReader*/, configuration);
    

    Documentation

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

    注意即使您拥有internal 属性,您也可能面临同样的问题

    internal int OrderID { get; set; }
    

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

    【讨论】:

      【解决方案3】:

      您现在可以使用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);
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        还有另一种方法可以解决这个问题:

        csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-23
          • 1970-01-01
          相关资源
          最近更新 更多