首先,我将提供一些背景信息,因此这个问题并非完全没有背景:
我正在编写一个程序,需要读取我知道格式/布局的二进制文件。这些文件中的大部分都包含“结构”,每个文件的布局都存储在文件的标题中。每个结构都包含可以是结构或“基础”类型的字段(不是结构体,可以是值或引用类型,如float
或String
或Vector3
)。
我不需要访问这些文件中的大部分数据,因此我不必为我当前的项目定义所有可能的结构,但是我必须定义手动执行它会很乏味耗时。
我的问题是这些结构数量非常多(2500多个不同的结构,尽管只有文件中出现的结构在该文件的标题中定义)。我希望能够以一种使所有数据以相同方式可用的方式读取它们,而无需手动定义每个数据。我目前的想法是我应该创建一个这样的类:
class Struct{
StructDefinition _def;
List < Field > _fields;
...
}
在字段类中,我需要能够存储结构和基类型(或更重要的是参考和值类型)。有没有办法做到这一点,而不是把所有东西变成object
,然后在我需要的时候把它变成正确的类型?另外,这是阅读这些文件的最佳方式,还是有更好的方法?
答案 0 :(得分:0)
如果定义一个包含操作字段所需的所有方法的接口,则可以创建一小组对象 - 一个用于引用,另一个用于值类型。
只要每个对象实现相同的接口,您就可以一般地使用它们。
答案 1 :(得分:0)
dynamic
(.NET 4.0)可以在运行时执行此操作,但是会丢失编译时类型安全性和IntelliSense。
对于您的特定情况,我建议使用.NET 4.0中的新文件映射类。
如果您需要预先的.NET 4.0解决方案,请考虑将该文件视为一系列偏移而不是结构,并使用FileStream
,仅搜索和读取您需要的信息。这有点像穷人的文件映射。请注意,在这种情况下,如果只是向前移动文件,它会更有效。
使用这两种解决方案中的任何一种,您都不必浪费时间和内存读取数据,无论如何都不需要。