使用 csvHelper 没有为类型映射任何属性
getting no properties are mapped for type using csvHelper
我有以下class
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();
}
}
并且我创建了一个映射 class,如 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();
我得到一个例外
no properties are mapped for type
发现问题..属性有一个私有集..
他们需要像这样 public..
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; }
因此,由于接受的答案工作正常,还有另一种方法可以解决此问题,如下所示
CsvConfiguration configuration = new CsvConfiguration
{
IgnorePrivateAccessor = true,
}
CsvReader reader = new CsvReader(/*your TextReader*/, configuration);
Gets or sets a value indicating if private member should be read from and written to. True to include private member, otherwise false. Default is false.
注意 即使您有 internal
属性
也可能会遇到同样的问题
internal int OrderID { get; set; }
对于较新版本的库,似乎 属性 更名为 IncludePrivateMembers
您现在可以使用 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);
}
}
}
}
还有另一种方法可以解决这个问题:
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
我的情况可能略有不同,因为我使用的是字段而不是属性,但它是相同的错误消息所以...
我有以下class
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();
}
}
并且我创建了一个映射 class,如 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();
我得到一个例外
no properties are mapped for type
发现问题..属性有一个私有集.. 他们需要像这样 public..
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; }
因此,由于接受的答案工作正常,还有另一种方法可以解决此问题,如下所示
CsvConfiguration configuration = new CsvConfiguration
{
IgnorePrivateAccessor = true,
}
CsvReader reader = new CsvReader(/*your TextReader*/, configuration);
Gets or sets a value indicating if private member should be read from and written to. True to include private member, otherwise false. Default is false.
注意 即使您有 internal
属性
internal int OrderID { get; set; }
对于较新版本的库,似乎 属性 更名为 IncludePrivateMembers
您现在可以使用 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);
}
}
}
}
还有另一种方法可以解决这个问题:
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
我的情况可能略有不同,因为我使用的是字段而不是属性,但它是相同的错误消息所以...