python enumeration_C# Enumeration 使用

1、关于enum的定义

enum Fabric

{

Cotton = 1,

Silk = 2,

Wool = 4,

Rayon = 8,

Other = 128

}

2、符号名和常数值的互相转换

Fabric fab = Fabric.Cotton;

int fabNum = (int)fab;//转换为常数值。必须使用强制转换。

Fabric fabString = (Fabric)1;//常数值转换成符号名。如果使用ToString(),则是((Fabric)1).ToString(),注意必须有括号。

string fabType = fab.ToString();//显示符号名

string fabVal = fab.ToString ("D");//显示常数值

3、获得所有符号名的方法(具体参见Enum类)

public enum MyFamily

{

YANGZHIPING = 1,

GUANGUIQIN = 2,

YANGHAORAN = 4,

LIWEI = 8,

GUANGUIZHI = 16,

LISIWEN = 32,

LISIHUA = 64,

}

foreach (string s in Enum.GetNames(typeof(MyFamily)))

{

Console.WriteLine(s);

}

4、将枚举作为位标志来处理

根据下面的两个例子,粗略地说,一方面,设置标志[Flags]或者[FlagsAttribute],则表明要将符号名列举出来;另一方面,可以通过强制转换,将数字转换为符号名。说不准确。看下面的例子体会吧。注意:

例一:

Fabric fab = Fabric.Cotton | Fabric.Rayon | Fabric.Silk;

Console.WriteLine("MyFabric = {0}", fab);//输出:Fabric.Cotton | Fabric.Rayon | Fabric.Silk;

例二:

class FlagsAttributeDemo

{

// Define an Enum without FlagsAttribute.

enum SingleHue : short

{

Black = 0,

Red = 1,

Green = 2,

Blue = 4

};

// Define an Enum with FlagsAttribute.

[FlagsAttribute]

enum MultiHue : short

{

Black = 0,

Red = 1,

Green = 2,

Blue = 4

};

static void Main( )

{

Console.WriteLine(

"This example of the FlagsAttribute attribute \n" +

"generates the following output." );

Console.WriteLine(

"\nAll possible combinations of values of an \n" +

"Enum without FlagsAttribute:\n" );

// Display all possible combinations of values.

for( int val = 0; val <= 8; val++ )

Console.WriteLine( "{0,3} - {1}",  val, ( (SingleHue)val ).ToString( ) );

Console.WriteLine(  "\nAll possible combinations of values of an \n" + "Enum with FlagsAttribute:\n" );

// Display all possible combinations of values.

// Also display an invalid value.

for( int val = 0; val <= 8; val++ )

Console.WriteLine ( "{0,3} - {1}",  val, ( (MultiHue)val ).ToString( ) );

}

}

/*

This example of the FlagsAttribute attribute

generates the following output.

All possible combinations of values of an

Enum without FlagsAttribute:

0 - Black

1 - Red

2 - Green

3 - 3

4 - Blue

5 - 5

6 - 6

7 - 7

8 - 8

All possible combinations of values of an

Enum with FlagsAttribute:

0 - Black

1 - Red

2 - Green

3 - Red, Green

4 - Blue

5 - Red, Blue

6 - Green, Blue

7 - Red, Green, Blue

8 - 8

*/

5、枚举作为函数参数。经常和switch结合起来使用。下面举例

public static double GetPrice(Fabric fab)

{

switch (fab)

{

case Fabric.Cotton: return (3.55);

case Fabric.Silk: return (5.65);

case Fabric.Wool: return (4.05);

case Fabric.Rayon: return (3.20);

case Fabric.Other: return (2.50);

default: return (0.0);

}

}

6、上面三点一个完整的例子

//1、enum的定义

public enum Fabric : short

{

Cotton = 1,

Silk = 2,

Wool = 3,

Rayon = 8,

Other = 128

}

//将枚举作为参数传递

public static double GetPrice(Fabric fab)

{

switch (fab)

{

case Fabric.Cotton: return (3.55);

case Fabric.Silk : return (5.65);

case Fabric.Wool: return (4.05);

case Fabric.Rayon: return (3.20);

case Fabric.Other: return (2.50);

default: return (0.0);

}

}

public static void Main()

{

Fabric fab = Fabric.Cotton;

int fabNum = (int)fab;

string fabType = fab.ToString();

string fabVal = fab.ToString ("D");

double cost = GetPrice(fab);

Console.WriteLine("fabNum = {0}\nfabType = {1}\nfabVal = {2}\n", fabNum, fabType, fabVal);

Console.WriteLine("cost = {0}", cost);

}

7、Enum类的使用

Enum.IsDefinde、Enum.Parse两种方法经常一起使用,来确定一个值或符号是否是一个枚举的成员,然后创建一个实例。Enum.GetName打印出一个成员的值;Enum.GetNames打印出所有成员的值。其中注意typeof的使用。这一点很重要。

public enum MyFamily

{

YANGZHIPING = 1,

GUANGUIQIN = 2,

YANGHAORAN = 4,

LIWEI = 8,

GUANGUIZHI = 16,

LISIWEN = 32,

LISIHUA = 64,

}

string s = "YANGHAORAN";

if (Enum.IsDefined(typeof(MyFamily), s))

{

MyFamily f = (MyFamily)Enum.Parse(typeof(MyFamily), s);

GetMyFamily(f);

Console.WriteLine("The name is:" + Enum. GetName(typeof(MyFamily), 2));

string[] sa = Enum.GetNames(typeof(MyFamily));

foreach (string ss in sa)

{

Console.WriteLine(ss);

8. Enumeration变量的文字描述

如果想要Enumeration返回一点有意义的string,从而用户能知道分别代表什么, 则按如下定义:

using System.ComponentModel;

enum Direction

{

[Description("this means facing to UP (Negtive Y)")]

UP = 1,

[Description("this means facing to RIGHT (Positive X)")]

RIGHT = 2,

[Description("this means facing to DOWN (Positive Y)")]

DOWN = 3,

[Description("this means facing to LEFT (Negtive X)")]

LEFT = 4

};

使用如下方法来获得文字描述:

using System.Reflection;

using System.ComponentModel;

public static String GetEnumDesc(Enum e)

{

FieldInfo EnumInfo = e.GetType().GetField(e.ToString());

DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[]) EnumInfo.

GetCustomAttributes (typeof(DescriptionAttribute), false);

if (EnumAttributes.Length > 0)

{

return EnumAttributes[0].Description;

}

return e.ToString();

}

或者可以自己定义Discription Attributes:(来自:James Geurts' Blog)

enum Direction

{

[EnumDescription("Rover is facing to UP (Negtive Y)")]

UP = 1,

[EnumDescription("Rover is facing to DOWN (Positive Y)")]

DOWN = 2,

[EnumDescription("Rover is facing to RIGHT (Positive X)")]

RIGHT = 3,

[EnumDescription("Rover is facing to LEFT (Negtive X)")]

LEFT = 4

}; AttributeUsage(AttributeTargets.Field)]

public class EnumDescriptionAttribute : Attribute

{

private string _text = "";

public string Text

{

get { return this._text; }

}

public EnumDescriptionAttribute(string text)

{

_text = text;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值