枚举标记十进制值/名称的转换

时间:2016-06-14 05:27:09

标签: c# enums enum-flags

我有很少的枚举标记代表版本的外部系统。我想确保,每当外部系统升级其版本时,我的功能应该能够支持它(我事先会知道该版本将被升级,因此它是一个主动的行动)。此外,我的通信必须与此系统同时进行,这意味着内部和外部通信可以具有不同的版本集。

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

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

这适用于正式的重大升级。可悲的是,我不能将它们命名为System1.0等等。另外,作为小数,我不能使用通用枚举解析器。

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

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

此外,我还需要标志或等效功能,因为我仍然可能会收到没有系统版本标识的通信,默认情况下会转到适用于所有版本。另一种通信可能仅适用于某些选择版本,例如。仅适用于2.0以上等。

请注意,我可以通过使用Switch / If轻松实现此目的,但我不希望有任何硬编码,除非没有其他(简单)方法。我主要担心的是具有像标志那样的功能,但很容易识别带小数位的值,比如1.0或1.2或1.3.1(尽管在历史他们从来没有双小数点),并提供编译时失败。我对其他机制的建议持开放态度,但我真的更喜欢它是一个简单的逻辑,因为它是整个过程中非常重要的一部分。

2 个答案:

答案 0 :(得分:2)

怎么样?
[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);

答案 1 :(得分:1)

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

<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可能会对您有所帮助。

我知道这并不适合您使用Enum的要求,但有时候替代设计会更适合整体。