如何使用枚举进行版本控制

时间:2018-06-08 12:33:56

标签: c# .net enums

我正在开发一个Revit插件,我需要在其中分配数据字段(使用外部存储)。我无法预见将来需要多少数据字段,所以我需要计划一些版本控制。我需要拥有整个版本的历史记录,以便稍后我可以编写版本处理器来将使用旧版本制作的实体升级到最新版本。

我需要按名称(字符串)引用这些字段,但我想使用枚举,因为在键入时很容易从列表中选择所需的值。

示例:

现在:

enum BoolFields_v1 { IsPipe, IsSomething }
未来:

enum BoolFields_v2 { IsPipe, IsSomething, IsSomethingElse }

但是,在我的代码中全局我想引用一个单独的枚举:BoolFields。我希望我可以这样做:

public enum BoolFields { get {return BoolFields_v2} }

private enum BoolFields_v1 { IsPipe, IsSomething }
private enum BoolFields_v2 { IsPipe, IsSomething, IsSomethingElse }

嗯,我知道不可能那样。任何想法如何实现?

3 个答案:

答案 0 :(得分:4)

我遇到过类似的问题,我选择了命名空间。最新版本始终位于非版本化命名空间中,旧版本为:

namespace My.Product
{
    private enum BoolFields { IsPipe, IsSomething, IsSomethingElse }
}

namespace My.Product.V1
{
    private enum BoolFields { IsPipe, IsSomething }
}

当您转到新版本时,您可以从当前版本复制相关模型并将其移至V2。然后,您可以毫无问题地编辑当前版本。

在这种情况下,在您的枚举中添加数字可以轻松将旧版本转换为新版本。

答案 1 :(得分:1)

您还可以使用预处理器指令,如下所示:

#define v1

#if v1
    private enum BoolFields { IsPipe, IsSomething }
#elif v2
    private enum BoolFields { IsPipe, IsSomething, IsSomethingElse }
#endif

使用#define创建的符号范围是定义符号的文件。您还可以通过在Project Properties => Build => Conditional Compilation Symbols中或通过/debug的编译器开关定义项目范围的符号。

答案 2 :(得分:0)

看起来是枚举的flags属性的一个很好的使用示例。

WinHttpHandler

在此示例中,如果您实例化[Flags] public enum Features { None = 0, IsPipe = 1, IsSomething = 2, IsSomethingElse = 4 } public class MyProduct { public Features VersionFeatures { get { return Features.IsPipe | Features.IsSomethingElse; } } } MyProduct(int) myVariable.VersionFeatures将返回5,您的代码可以检查特定功能myVariable.VersionFeatures.HasFlag(Features.IsSomething)是否会返回false }。