访问不同命名空间中的枚举

4
我将使用C#在VS2005中进行翻译。我有一个包含多个枚举的类库,这些枚举常用于不同的项目。当访问其中一个枚举时,即使我已经声明了包含该枚举的命名空间的“using”指令,我仍然需要指定整个命名空间路径到该枚举。
例如,我有以下枚举:
namespace Company.General.Project1
{
   public static class Rainbow
   {
    [Flags]
    public enum Colours
    {
      Red,
      Blue,
      Orange
    }
  }
}

然后在我的另一个项目中:

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = Company.General.Project1.Colours.Red;
  }
}

尽管我使用了“Using”指令引用包含枚举类的项目,但我仍然必须手写枚举类型。 为什么我不能这样做...
using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = Colours.Red;
  }
}
2个回答

16

你的枚举不仅在命名空间中 - 它是一个嵌套类型。实际上,你的示例“工作”的代码不会起作用,它必须是:

int myValue = (int) Company.General.Project1.Rainbow.Colours.Red;

不仅需要包含 Rainbow 部分,还不存在从枚举类型到整数类型的隐式转换。

将你的枚举类型定义为顶层类型:

namespace Company.General.Project1
{
    [Flags]
    public enum Colours
    {
        Red,
        Blue,
        Orange
    }
}

然后您就可以编写:

using Company.General.Project1;

...

Colours x = Colours.Red;
int y = (int) Colours.Red;

(请注意,要有效地使用[Flags],您应该明确地分配值,例如1、2、4、8...)


编辑:我一直认为您真的想能够使用Colours.Red等。您可以保留当前的结构,使用嵌套类型,只需编写:

Rainbow.Colours x = Rainbow.Colours.Red;
int y = (int) Rainbow.Colours.Red;

除非你有特别的理由使枚举嵌套,否则我不会这样做。


+1 - 如果在Rainbow类内使用,则可以将其简写为"Rainbow.Colours.Red"。 - AdaTheDev
那是他的主要问题,为什么在使用时它不起作用。 :) - Dykam
我已将枚举移出静态类,现在可以按照我的意愿访问它。谢谢。很抱歉让你多做了一些工作——我发布的代码只是示例代码,用于突出命名空间情况,我省略了位值和整数转换,以保持简单。 - Chris B

0

你可以将枚举移出静态类 - 它们可以独立存在。所以这样做是可行的:

namespace Company.General.Project1
{
  [Flags]
  public enum Colours
  {
    Red,
    Blue,
    Orange
  }
}

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = (int)Colours.Red;
  }
}

但是如果你将枚举保留在这个静态类中,那么它只能在该上下文中被引用:

using Company.General.Project1;

namespace Company.SpecialProject.Processing
{
  public class MixingPallette
  {
    int myValue = (int)Rainbow.Colours.Red;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接