C# 将实际记录作为属性包含在Filehelpers记录对象中
我正在使用Filehelpers库解析BgMax文件(由行分隔的普通文本文件,每个属性在行中具有特定的长度),并成功创建了具有FixedLengthRecord的对象和记录。但是,我希望将每条记录的整行存储为字符串,而不仅仅将属性存储为对象。是否有一种简洁的方法,比如向Record类添加FieldHidden属性或其他内容,以便它自动将整行保存在那里?我还想在创建记录对象后保存该行,但我认为这样做有点复杂/不是一个好主意,因为我认为我需要通过反射访问属性 这里的一个例子是我使用的一个记录类C# 将实际记录作为属性包含在Filehelpers记录对象中,c#,filehelpers,C#,Filehelpers,我正在使用Filehelpers库解析BgMax文件(由行分隔的普通文本文件,每个属性在行中具有特定的长度),并成功创建了具有FixedLengthRecord的对象和记录。但是,我希望将每条记录的整行存储为字符串,而不仅仅将属性存储为对象。是否有一种简洁的方法,比如向Record类添加FieldHidden属性或其他内容,以便它自动将整行保存在那里?我还想在创建记录对象后保存该行,但我认为这样做有点复杂/不是一个好主意,因为我认为我需要通过反射访问属性 这里的一个例子是我使用的一个记录类 [F
[FixedLengthRecord(FixedMode.AllowMoreChars)]
public class StartRecord
{
[FieldFixedLength(2)]
public string PostType;
[FieldFixedLength(20)]
public string LayoutName;
...
[FieldFixedLength(1)]
public string TestMarker;
}
在这个StartRecord类中,我希望有另一个名为Source的字符串属性,它将在转换为object之前包含整行。
该对象是从这段代码中填充的,很容易得到这一行,因为它的记录来自记录列表的foreach循环
switch (record.Substring(0, 2))
{
case "01":
return typeof (StartRecord);
}
因此,我可以在这里填充属性,但我不太喜欢它。您可以使用事件界面:
[FixedLengthRecord(FixedMode.AllowMoreChars)]
public class StartRecord
: INotifyRead
{
[FieldFixedLength(2)]
public string PostType;
...
// Field hidden to the lib
[FieldHidden]
public string Source;
public void BeforeRead(BeforeReadEventArgs e)
{
this.Source = e.RecordLine;
}
public void AfterRead(AfterReadEventArgs e)
{
}
}
如果需要行而不是反序列化对象,为什么不直接读取文件的行而不是对象呢?你需要提出一个更具体的问题。我们不知道您的FileHelpers库代码是什么样子的。也许你应该添加一些代码,它会变得更清晰?Filehelpers库可以在这里找到,也可以在我使用的标记的描述中找到。我还包括了一些代码,但我认为这样做的实现非常简单。最“简单”的解决方案可能是编写如下内容:
public-Soutrce{get{return-PostType+LayoutName+TestMarker}
,当然您可以进行反射。你可以在这里修改代码:我已经看到了这个线程,但我会认为这是最后的方法。我想先看看是否可以从类本身开始使用原生FileHelpers装饰。很抱歉,我没有使用FileHelpers。。。我在这个线程中看到,FileHelper可以将值解析为数组,为什么不将行解析为数组属性,然后让属性返回数组的正确索引:publicstringpostType{get{returnarrayproperty[0]}
和publicstringsource{get{string.Join(“,ArrayProperty)}
这样您就不需要额外的存储空间了。字符串.Join在不保留整个行的情况下可能表现良好。我刚刚尝试过这个。这似乎是正确的答案。但是,事件未触发,字符串仍为null。你知道为什么会这样吗?你是在读还是在写?你用的是什么发动机?什么版本的库?阅读,版本是3.1.5(我刚从nuget获得最新版本)。