我经常遇到这个问题,但我还没有找到令人满意的解决方案。
我正在为savegames实现一个阅读器(但它也可以应用于其他类型的文件)。根据版本,有一些添加的条目,但顺序始终保持不变。因此我创建了一个类:
public class Entry<T> {
public T Value;
public readonly FileVersion MinVersion;
public Entry(T v = default(T), ScenarioVersion m = FileVersion.V115) {
Value = v;
MinVersion = m;
}
}
现在,您猜,我想用尽可能少的代码编写这些条目。我只想写一行if (version >= MinVersion) { /* write data */ }
。条目可以是原始类型或对象,这是问题......
应该定义一个接口并为每个需要的原始类型实现它作为包装器吗?还是有更优雅的解决方案?
答案 0 :(得分:1)
(查看具体问题的评论。)
只有在满足特定条件时才会写入某些值。
这些条件是在读取/写入文件时是否已知,或者在读取时是否基于文件中的其他数据?如果是前者(已知),则传入Func<bool>
,必须求值为true才能进行读或写操作。调用者可以提供适当的委托或lambda方法来做出决定。你在问题中提到了最低版本。我认为这是一个例子。
如果是后者(根据文件中的其他数据读取/写入值),这是一个更广泛的问题。如果可以对文件中较早的数据或已知位置做出决定,请加载它并将适当的参数传递给Func。否则,您可能需要查看更复杂的解析机制,但我认为这不是您所要求的。
它不是一个静态结构,包含一些像struct {int len;炭[长度]; }。
.Net提供了多种序列化对象的方法,但我怀疑你想要以定义的格式进行读/写,例如将字符串存储为长度后跟8位字符的格式。如果.Net机制不能满足您的需求,您可能需要编写自己的机制。有关详细信息,请参阅Byte for byte serialization of a struct in C#,包括使用Marshal
获取基元的基础字节。
另外,更多可供参考,如果您想避免编写原始类型,可以使用public class Entry<T> where T: class
。