0

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

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

[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 (尽管在历史上它们从未有双小数点),并提供编译时间故障。我对其他机制的建议持开放态度,但我真的更希望它是一个简单的逻辑,因为它是整个过程中非常微不足道的一部分。

4

2 回答 2

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);
于 2016-06-14T05:51:46.743 回答
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 页面针对懒惰编码器的自定义配置部分可能会对您有所帮助。

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

于 2016-06-14T05:50:40.187 回答