2009-07-13 42 views
3

我在VS2005中使用C#。我有一个类库,其中包含几个通用于许多不同项目的枚举。当访问这些枚举之一时,即使我已经向包含该枚举的名称空间声明了“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; 
    } 
} 

即使我有“使用”指令引用包含类的项目枚举,我仍然需要写enum longhand。 为什么我不能做以下...

using Company.General.Project1; 

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

回答

15

您枚举不只是在命名空间 - 这是一个嵌套类型。事实上,你的样品“工作”的代码是行不通的,它必须是

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

(你不仅需要包括Rainbow的一部分,但也有由枚举型的隐式转换为int。 )

让你枚举顶层类型:

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; 

除非你有一个特别的理由,使枚举嵌套,但是,我不会。

+0

或'INT myvalue的=(INT)Rainbow.Colours .Red;'ofcourse, – Dykam 2009-07-13 10:09:41

+0

+1 - 如果保存在Rainbow类中,应该能够使用“Rainbow.Colours.Red”作为缩短版本。 – AdaTheDev 2009-07-13 10:12:20

+0

是的 - 我假设OP不想这样做。将编辑... – 2009-07-13 10:22:38

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