【问题标题】:Mapping two identical enumeration with different namespaces用不同的命名空间映射两个相同的枚举
【发布时间】:2013-11-20 07:33:23
【问题描述】:

我有两个相同的 C# 枚举定义如下:

public enum ArrivalToleranceEnum
{
    ZERO,
    QUARTERHOUR,
    HALFHOUR,
    ONEHOUR,
    TWOHOURS,
}

public enum ArrivalTolerance {

    /// <remarks/>
    ZERO,

    /// <remarks/>
    QUARTERHOUR,

    /// <remarks/>
    HALFHOUR,

    /// <remarks/>
    ONEHOUR,

    /// <remarks/>
    TWOHOURS,
}

ArrivalTolerance 在外部库中定义,在我的程序中我想使用本地枚举 ArrivalToleranceEnum 所以我需要转换这两种类型。我怎样才能做到这一点?我已经尝试最终做到这一点(使用开关),但它非常乏味而且不是很节省时间,因为我需要转换其他更大的枚举。

【问题讨论】:

    标签: c# parsing enums type-conversion


    【解决方案1】:

    枚举值由整数常量表示。 如果底层枚举常量相同,只需强制转换:

    (ArrivalToleranceEnum)(int)ArrivalTolerance.HALFHOUR
    

    如果它们不同,您可以使用反射代码或Enum 类的静态成员之一自动映射。不过,这更乏味,也更慢。

    【讨论】:

    • 你假设枚举的顺序是相同的
    • @wudzik 我在答案中明确指出了这一点。如果它们不相同,您可以使用答案中给出的基于字符串或反射的方法。
    • @usr 不是如果常量相同,但顺序相同:) 但可以肯定,例如在这个问题中这将起作用
    • @wudzik 枚举在 CLR 级别没有顺序。 C# 使用顺序来分配整数常量。
    • @usr 我的意思是代码中的顺序应该影响枚举值的 int 值
    【解决方案2】:

    如果只有名字匹配,不按顺序使用这个

    var value = Enum.Parse(typeof(ArrivalToleranceEnum),ArrivalTolerance.ToString());
    

    如果您不确定所有枚举的 int 值是否匹配,最好使用字符串匹配解决方案。

    【讨论】:

      【解决方案3】:

      枚举是int 类型的子集,你可以这样做:

      ArrivalToleranceEnum ext;
      ArrivalTolerance your_enum=(ArrivalTolerance)((int)ext);
      

      如果名称相同,wudzik建议的解决方案是最安全的。

      您还可以指定要与每个枚举关联的 int 值,例如HALFHOUR=0,

      【讨论】:

        【解决方案4】:

        如果顺序匹配,可以直接投:(ArrivalToleranceEnum)ArrivalTolerance.ZERO

        但是,如果映射应该更具体,我建议使用Dictionary&lt;ArrivalTolerance,ArrivalToleranceEnum&gt;,因为它比使用Enum.Parse 快得多。

        【讨论】:

          猜你喜欢
          • 2012-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          • 2011-04-10
          相关资源
          最近更新 更多