2

我经常遇到这个问题,但我还没有找到令人满意的解决方案。

我正在实现一个用于保存游戏的阅读器(但它也可以应用于其他类型的文件)。根据版本,有一些添加的条目,但顺序始终保持不变。因此我创建了一个类:

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 */ }。条目可以是原始类型或对象,这是问题所在......

应该为每个需要的原始类型定义一个接口并实现它作为包装器吗?还是有更优雅的解决方案?

4

1 回答 1

1

(查看评论以了解具体问题。)

某些值仅在满足特定条件时才写入。

这些条件在读取/写入文件时是否已知,或者在读取时是否基于文件中的其他数据?如果是前者(已经知道),则传入一个Func<bool>必须评估为真才能发生读取或写入操作的值。调用者可以提供适当的委托或 lambda 方法来做出决定。您在问题中提到了最低版本。我认为这是一个例子。

如果是后者(根据文件中的其他数据读取/写入值),这是一个更广泛的问题。如果可以对文件中较早的数据或已知位置的数据做出决定,则加载它并将适当的参数传递给 Func。否则,您可能需要查看更复杂的解析机制,但我认为这不是您要问的。

它不是静态结构,包含一些东西,比如 struct { int len; 字符[len]; }。

.Net 提供了多种序列化对象的方法,但我怀疑您希望以定义的格式读取/写入,例如将字符串存储为长度后跟 8 位字符的格式。如果 .Net 机制不能满足您的需求,您可能必须自己编写。有关这方面的更多信息,包括使用来获取基元的底层字节,请参阅Byte 以了解 C# 中结构的字节序列化。Marshal

另外,更多参考,如果你想避免写出原始类型,你可以使用public class Entry<T> where T: class.

于 2013-01-09T10:11:01.993 回答