2010-01-14 126 views
1

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

我已经定义了一些用于转换整数代码的扩展方法,但是这些整数代码与从转换到int的返回值不同。如果另一个程序员用我的枚举编程,我恐怕他们会尝试从习惯中抛出和抛出整数。程序只会默默接受错误的代码。

有没有办法阻止我的枚举显式转换为/从int?如果不是,如果有人尝试,是否有办法引发异常?或者挂钩我自己的转换功能?或者在运行时更改枚举的基础值?

+0

请改用字符串? – 2010-01-14 18:10:12

+1

或使整数代码DO匹配。为什么这不可能? – Aaronaught 2010-01-14 18:26:21

+0

在编译时无法对字符串进行类型检查 ... 我有一些我知道的整数代码,所以是的,我可以将枚举硬编码为这些值。但是API可能会在未来改变它们的价值,我可能会硬编码并在发生问题时处理问题,但这是一个有趣的编程问题,我希望有一个有趣的答案。 – 2010-01-14 19:07:04

回答

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

的确非常非常脏。 – GalacticCowboy 2010-01-14 18:23:21

+0

我想避免使用这样的课程,但我可能会选择它,基于我遇到的困难。 – 2010-01-14 19:08:38

+1

如果想要使用有问题类型的变量(而不是'int'),可以使用支持转换为或来自“Int32”的结构。 – supercat 2013-11-13 19:14:23

1

这样做的另一种方式,可能是有意义的:在你的程序中定义枚举和外部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]; } 
    } 
} 

只要所有访问API,通过这个类(一个希望你已经封装在一个类外部API访问),您可以自由使用MyEnum无处不在您的应用程序中没有做担心其他程序员如何处理这些值。

+0

不幸的是,这是一个很大的遗留代码库,所以没有像这样的单个瓶颈点。有电话_everywhere_。我试图咬掉可管理的块并重构它们,但我一直在遇到类似这样的情况,我无法一次修复所有内容,并且我不能保证其他编码器不会继续恶习。 – 2010-01-14 19:12:10