我有一个枚举枚举从外部API返回的整数值的枚举,以便在我的代码中使用。但是我不一定知道编译时的整数值,所以我有一些代码在程序启动时挂起它们并将它们存储在一个Dictionary中。
我已经为整数代码定义了一些扩展方法,但这些整数代码与从强制转换为int的方法不同。如果另一个程序员用我的枚举进行编程,我担心他们会尝试从习惯中抛出整数。而且程序会默默地接受错误的代码。
有没有办法阻止我的枚举显式转换为int?如果没有,有没有办法导致异常被抛出,如果有人尝试?或者连接我自己的转换函数?或者在运行时更改枚举的基础值?
答案 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
而无需担心其他程序员对这些价值观做了什么。