十进制的枚举标志转换 values/names

Enum Flags conversions for Decimal values/names

我有几个 枚举标志 代表外部系统版本。我想确保,每次外部系统升级它的版本时,我的功能应该能够支持它(我会提前知道版本会升级,所以这是一个主动的行动)。此外,我的通信必须是双向的,这意味着内部和外部通信可以有不同的版本集。

我创建了一个枚举标志来表示这些版本。

[Flags]
public enum ExternalSystemVersionEnum
{
    System1 = 1,
    System2 = 2,
    System3 = 4,
    All = 7
}

这对于正式的重大升级来说没问题。遗憾的是我不能将它们命名为 System1.0 等。另外,作为它的小数点,我不能使用通用枚举解析器。

(T) Enum.Parse(typeof (T), Convert.ToString(enumValue));

当然,我仍然可以通过使用 switch/if 语句 来实现上述目标,但我真的想避免任何硬编码(如果可以的话甚至 Resources/Contants),因为外部系统的一个版本可能会被完全丢弃,我不想为必须追查所有字符串而烦恼。

我还需要 Flags 或等效的 功能,因为我可能仍会收到没有系统版本标识的通信,默认情况下会转到 适用于所有版本。另一个通信可能只适用于 某些 select 版本 ,例如。仅适用于 2.0 等

请注意,我可以使用 Switch/If 轻松实现此目的,但我不希望进行任何硬编码,除非没有其他(简单)方法。我在这里主要关心的是具有类似于标志的功能,但可以轻松地识别带小数位的值,比如 1.0 或 1.2 或 1.3.1就此而言(尽管在历史上他们从未有过两位小数),并提供了编译时失败。我愿意接受其他机制的建议,但我真的更希望它是一个简单的逻辑,因为它是整个过程中非常微不足道的一部分。

听起来这些值可能会发生变化,具体取决于连接的系统以及连接的系统是否会升级。为了删除硬编码并使其更加灵活,我建议将您的数据添加为 app.config 文件中的自定义部分。通过这种方式,您可以轻松 modify/add/remove 值,而无需在每次更改时都重新编译。

<configSections>
    <section name="SystemVersions" type="YourAppName.SystemVersionSection, YourAppName" />
</configSections>

<SystemVersions>
    <system version="1.0" />
    <system version="2.0" />
    <system version="1.3.1" />
    <system version="All" />
</SystemVersions>

此 CodeProject 页面 Custom Configuration Sections for Lazy Coders 可能对您有所帮助。

我知道这不太符合您使用枚举的要求,但有时替代设计会更适合整体。

[Flags]
public enum ExternalSystemVersionEnum
{
    System1_1 = 1,
    System2_1 = 2,
    System3_2 = 4,
    All = 7
}

var enumString = decimalValue.ToString("0.0", 
    CultureInfo.InvarantCulture).Replace('.', "_");

var enumValue = (ExternalSystemVersionEnum)Enum.Parse(
    typeof(ExternalSystemVersionEnum), enumString);