【问题标题】:Accessing an enum in a different namespace访问不同命名空间中的枚举
【发布时间】:2009-07-13 10:04:11
【问题描述】:

我在 VS2005 中使用 C#。我有一个类库,其中包含许多不同项目共有的几个枚举。当访问其中一个枚举时,我必须指定枚举的整个命名空间路径,即使我已经向包含枚举的命名空间声明了“使用”指令。

例如我有以下枚举:

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 Company.General.Project1;

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

【问题讨论】:

    标签: c# enums namespaces


    【解决方案1】:

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

    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”作为缩短版本。
    • 这是他的主要问题,为什么它在使用时不起作用。 :)
    • 我已将枚举移出静态类,现在可以按我的意愿访问它。谢谢你。抱歉让您做额外的工作 - 我发布的代码只是示例代码,以突出命名空间情况,我省略了按位值和 int 转换以保持简单。
    【解决方案2】:

    您可以将枚举移出静态类 - 它们可以独立存在。所以这会起作用:

    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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2012-10-18
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多