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

C# 如何使用枚举进行版本控制,c#,.net,enums,C#,.net,Enums,我正在使用Revit附加组件,需要在其中指定数据字段(带有外部存储)。我无法预测将来需要多少数据字段,所以我需要计划一些版本控制。我需要有完整的版本历史记录,以便我可以稍后对版本处理器进行编程,以将使用旧版本创建的实体升级到最新版本 我需要按名称(字符串)引用这些字段,但我想使用枚举,因为键入时很容易从列表中选择所需的值 例如: 现在: 未来: enum BoolFields_v2 { IsPipe, IsSomething, IsSomethingElse } 然而,在我的代码中,我想引用一

我正在使用Revit附加组件,需要在其中指定数据字段(带有外部存储)。我无法预测将来需要多少数据字段,所以我需要计划一些版本控制。我需要有完整的版本历史记录,以便我可以稍后对版本处理器进行编程,以将使用旧版本创建的实体升级到最新版本

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

例如:

现在:

未来:

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 }

嗯,我知道这是不可能的。有什么办法可以做到这一点吗?

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

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

namespace My.Product.V1
{
    private enum BoolFields { IsPipe, IsSomething }
}
当您转到新版本时,可以从当前版本复制相关模型并将其移动到
V2
。然后您可以编辑当前版本而不会出现问题


在这种情况下,向枚举中添加数字将简化旧版本到新版本的转换。

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

[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
class a
(int)myVariable.VersionFeatures
将返回
5
,您可以检查特定功能
myVariable.VersionFeatures.HasFlag(features.IsSomething)
将返回
false

您还可以按如下方式使用预处理器指令:

#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

的编译器开关来定义项目范围内的符号。没有简单的方法可以做到这一点。您需要明确地引用V1或V2,而不是使用EnUM类来考虑。请提醒我EnUM <代码> [FLAG] 属性。您在这里创建的映射(版本到使用的字段)可能适合当前的情况,但是您将不得不创建不同版本的解决方案,而不是字段添加。当一个场消失时会发生什么?还是重新设计?还是添加函数?枚举也不能继承,因此
Enum1.Field1
Enum2.Field1
之间没有关系(除非按int值)。但我看不出你现在所做的有什么好处。枚举应该是“选择其中一个值”,而不是“同时使用一组值”。@Flater您能建议不同的方法吗?我计划使用IntFields enum,其中将有“版本”字段-通过从实体中读取值,我将知道版本是当前版本还是过期版本,如果过期版本有什么区别以及如何处理它。
#define v1

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