C# FileHelper ReadFile()返回null

C# FileHelper ReadFile()返回null,c#,filehelpers,C#,Filehelpers,我正在使用很棒的FileHelpers库版本2.9.9。然而,我已经被困了几个小时,我无法解决这个问题。我想将文件加载到CustomerClass对象的数组中。我想利用DelimitedClassBuilder动态更改字段的顺序。我在Stackoverflow上找到了一个答案,它展示了如何做到这一点。即使按照这个答案,我也做不到。但是,如果我直接将该类与FileHelperEngine而不是DelimitedClassBuilder一起使用,它就可以正常工作。谁能帮我一下吗 这是我想从csv文件

我正在使用很棒的FileHelpers库版本2.9.9。然而,我已经被困了几个小时,我无法解决这个问题。我想将文件加载到CustomerClass对象的数组中。我想利用DelimitedClassBuilder动态更改字段的顺序。我在Stackoverflow上找到了一个答案,它展示了如何做到这一点。即使按照这个答案,我也做不到。但是,如果我直接将该类与FileHelperEngine而不是DelimitedClassBuilder一起使用,它就可以正常工作。谁能帮我一下吗

这是我想从csv文件创建一个数组的对象:

[DelimitedRecord(";")]
public class CustomerClass
{
    public string CustomerId;

    public string FirstName;

    public string LastName;
}
这是我用来创建数组的代码:

public void ReadFile()
{
    DelimitedClassBuilder cb = new DelimitedClassBuilder("CustomerClass", ";");
    cb.AddField("CustomerId", typeof(string));
    cb.AddField("FirstName", typeof(string));
    cb.AddField("LastName", typeof(string));

    FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass());
    engine.ErrorMode = ErrorMode.IgnoreAndContinue;

    string filename = @"C:\temp\customerfile.csv";

    DataTable dt = engine.ReadFileAsDT(filename); // Works fine
    object[] test = engine.ReadFile(filename) as object[]; // Works fine

    CustomerClass[] customers = engine.ReadFile(filename) as CustomerClass[]; // Returns null (probably because the 'cast' is invalid, see line below)
    customers = (CustomerClass[])engine.ReadFile(filename); // Throws InvalidCastException (Unable to cast object of type 'CustomerClass[]' to type 'MyNamespace.CustomerClass[]'.)
}
以下是文件内容:

客户ID;名字;姓氏

一,;詹姆斯;棕色的

二,;罗伯特;磨坊主

三,;大卫;绿色的


请尝试完全限定的类名:


DelimitedClassBuilder cb=新DelimitedClassBuildererMyNameSpace.CustomerClass

根据您提供的评论,我建议使用以下内容:

var customers = engine.ReadFile(filename)
                      .Cast<*type of the class coming back from ReadFile*>()
                      .Select(c => new MyNamespace.CustomerClass()
                                       {
                                            CustomerId = c.CustomerId,
                                            FirstName = c.FirstName,
                                            LastName = c.LastName
                                       })
                      .ToArray();

您将需要提供从engine.ReadFile返回给Cast调用的类的类型。调用Select将为每个返回的客户创建一个CustomerClass实例。

项目中是否有多个不同名称空间的CustomerClass?如果使用var customers=engine.readfilefilefilename;,结果如何;。客户解析为什么类型?阵列中的类型是什么?它们显然是对象,但其中存储的是什么类型?该类型没有解析为对象它解析为CustomerClass,而是与我的CustomerClass不同的CustomerClass,因为此CustomerClass是使用DelimitedClassBuilder动态构造的。它包含4个对象。对象名是CustomerId、FirstName和LastName。我已经试过了。这会引发异常:字符串“MyNamespace.CustomerClass”不是有效的.NET标识符。我还尝试使用cb.NameSpace=MyNamespace.CustomerClass,这也会引发InvalidCastException…CustomerClass在同一个项目中吗?如果没有,您还需要指定程序集。CustomerClass在同一个项目中。我不知道。我试图查找库的源代码,但它在工作时被阻止。这也会引发invalidcast:无法将类型为“CustomerClass”的对象强制转换为类型为“MyNamespace.CustomerClass”。至于void,这只是我构造的一个简单示例,方法看起来非常不同。我只是想确保这个简单的小示例能够正常工作……我要说的是,CustomerClass是从ReadFile和MyNamespace的调用中产生的。CustomerClass是您想要的吗?是的,这是正确的。我试图将正确的命名空间添加到cb.namespace属性,但这也会导致无效的强制转换。感谢提供的解决方案,我知道我的问题有解决方法,我一直在寻找一个利用FileHelpers库的解决方案,因为在谷歌搜索时,似乎有其他人已经成功地建立了这样一个解决方案…谢谢你的新建议!我试过了,但不幸的是,这也产生了一个无效的例外。目前,我正在使用数组对象中的反射来访问数据。