Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#防止枚举到整数的转换_C#_Enums - Fatal编程技术网

C#防止枚举到整数的转换

C#防止枚举到整数的转换,c#,enums,C#,Enums,我有一个枚举,枚举从外部API返回的整数值,以便于在代码中使用。但我在编译时不一定知道整数值,所以我有一些代码在程序启动时将它们连接起来并存储在字典中 我已经定义了一些转换整数代码的扩展方法,但是这些整数代码与转换为int时返回的不同。如果其他程序员使用我的enum编程,恐怕出于习惯,他们会尝试转换整数。程序会默默地接受错误的代码 有没有办法阻止将枚举显式转换为int或int?如果没有,是否有方法在有人尝试时引发异常?或者连接我自己的转换函数?或者在运行时更改枚举的基础值?您正在尝试的内容非常“

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

我已经定义了一些转换整数代码的扩展方法,但是这些整数代码与转换为int时返回的不同。如果其他程序员使用我的enum编程,恐怕出于习惯,他们会尝试转换整数。程序会默默地接受错误的代码


有没有办法阻止将枚举显式转换为int或int?如果没有,是否有方法在有人尝试时引发异常?或者连接我自己的转换函数?或者在运行时更改枚举的基础值?

您正在尝试的内容非常“脏”

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


你正在尝试的东西很“脏”

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


另一种可能有意义的方法是:在程序中定义枚举,并将外部API的值映射到私有方法中的枚举。换句话说,不要在对象模型中的任何地方公开外部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]; }
   }
}
public enum MyEnum{First,Second,Third};
公共类MyApiWrapper
{
私有字典ExternalToInternal=新字典();
private Dictionary InternalToExternal=新字典();
公共MyApiWrapper(列出externalApiEnumValues)
{
foreach(int i=0;i

只要所有对API的访问都是通过这个类完成的(希望您已经将外部API访问封装在一个类中),您可以在应用程序中的任何地方自由使用MyEnum,而不必担心其他程序员如何处理这些值。

另一种可行的方法是:在程序中定义枚举,并将外部API的值映射到私有方法中的枚举。换句话说,不要在对象模型中的任何地方公开外部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]; }
   }
}
public enum MyEnum{First,Second,Third};
公共类MyApiWrapper
{
私有字典ExternalToInternal=新字典();
private Dictionary InternalToExternal=新字典();
公共MyApiWrapper(列出externalApiEnumValues)
{
foreach(int i=0;i

只要所有对API的访问都是通过这个类完成的(希望您已经在一个类中封装了外部API访问),您就可以在应用程序中的任何地方自由使用
MyEnum
,而不必担心其他程序员如何处理这些值。

或者使其与整数代码匹配。为什么不可能?无法在编译时对字符串进行类型检查。。。我知道一些整数代码,所以是的,我可以将枚举硬编码为这些值。但是API将来可能会改变它们的值,等等。我可以硬编码它,并在出现问题时处理它们,但这是一个有趣的编程问题,我希望它有一个有趣的答案。或者让它使整数代码匹配。为什么不可能?无法在编译时对字符串进行类型检查。。。我知道一些整数代码,所以是的,我可以将枚举硬编码为这些值。但是API将来可能会改变它们的值,等等。我可以硬编码它,并在出现问题时处理问题,但这是一个有趣的编程问题,我希望有一个有趣的答案。我想避免使用这样的类,但无论如何我可能会选择它,基于我所经历的困难。如果希望能够使用所讨论类型的变量(而不是
int
),可以使用支持到
Int32
或从
Int32
转换的结构。我希望避免使用这样的类,但无论如何我都可以选择它,基于我所经历的困难。如果希望能够使用所讨论类型的变量(而不是
int
),可以使用支持到
Int32
或从
Int32
转换的结构。不幸的是,它是一个庞大的遗留代码库,因此没有一个这样的瓶颈。到处都有电话。我试图咬掉可管理的代码块并对其进行重构,但我经常遇到这样的情况,即我无法一次修复所有内容,也无法保证其他程序员不会继续保持坏习惯。不幸的是,这是一个庞大的遗留代码库,因此没有一个像这样的瓶颈。每个人都有电话