C#阻止枚举进行int转换

时间:2010-01-14 18:05:11

标签: c# enums

我有一个枚举枚举从外部API返回的整数值的枚举,以便在我的代码中使用。但是我不一定知道编译时的整数值,所以我有一些代码在程序启动时挂起它们并将它们存储在一个Dictionary中。

我已经为整数代码定义了一些扩展方法,但这些整数代码与从强制转换为int的方法不同。如果另一个程序员用我的枚举进行编程,我担心他们会尝试从习惯中抛出整数。而且程序会默默地接受错误的代码。

有没有办法阻止我的枚举显式转换为int?如果没有,有没有办法导致异常被抛出,如果有人尝试?或者连接我自己的转换函数?或者在运行时更改枚举的基础值?

2 个答案:

答案 0 :(得分:10)

你正在尝试的是非常“脏”。

使用具有只读值而不是枚举值的静态类。然后,您可以在类型初始值设定项中初始化值(或通过静态方法):

public static class Foos
{
    public static readonly int First;
    public static readonly int Second;

    //...

    static Foos()
    {
        //For Example:
        First = DateTime.Now.Day;
        First = DateTime.Now.Month;
    }
}

答案 1 :(得分:1)

这样做的另一种方法可能有意义:在程序中定义Enum并将私有方法中的外部API值映射到Enum。换句话说,不要在对象模型中的任何位置公开外部API的类型。例如:

public enum MyEnum { First, Second, Third };

public class MyApiWrapper
{
   private Dictionary<int, int> ExternalToInternal = new Dictionary<int, int>();
   private Dictionary<int, int> InternalToExternal = new Dictionary<int, int>();

   public MyApiWrapper(List<int> externalApiEnumValues)
   {
      foreach (int i = 0; i < externalApiEnumValues.Count; i++)
      {
         ExternalToInternal[externalApiEnumValues[i]] = i;
         InternalToExternal[i] = externalApiEnumValues[i];
      }
   }

   // obviously, your real method for calling the external API 
   // will do more than this.
   public void CallApi()
   {
      CallExternalApi(_EnumValue);
   }

   private MyEnum _ExternalEnumValue;
   public MyEnum EnumValue
   {
      get { return ExternalToInternal[_ExternalEnumValue]; }
      set { _ExternalEnumValue = InternalToExternal[value]; }
   }
}

只要通过此类完成对API的所有访问(希望您已经在类中封装了外部API访问),您就可以在应用程序内的任何位置自由使用MyEnum而无需担心其他程序员对这些价值观做了什么。