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