C#枚举总结和其扩展用法(通过枚举描设置枚举值)

C#中枚举是一个非常好用的类型,用会了之后确实方便了很多。

项目中一个枚举类型:

public enum Version_Type : byte
{
    [Description("1997版")]
    版本1997 = 0 ,
    [Description("2007版")]
    版本2007
}

枚举类型的默认类型是int型,可以改变其使用的类型,需要用(: <type>)来进行设置,上例中<type>为byte,也可以用其它类型(byte,sbyte,short,ushort,int,uint,long,ulong)

访问控制符不可以为private,protected或者protected internal

枚举有描述,枚举变量,枚举值。

枚举描述可以没有,需要声明如上例需要加上引用 using System.ComponentModel;

枚举变量不允许特殊字符(-,空格或者括号之类的(具体的以后补充)),允许使用下划线(_)不能以数字开头。因为枚举变量名称这些限制,所以有时候需要用描述来进行处理(如上例中枚举变量必须使用字符开头,所有需要对用户显示版本信息的时候“1997版”就不能直接当枚举变量,只能使用“版本1997”,有人说这样也能接受啊,但是当要有其它说明的时候比如有空格之类的特殊说明性文字就没法转换了。在C#利用反射动态根据传入属性创建对应控件文章中动态传入枚举,然后列出所有枚举项名称,因为枚举名称限制,所以后来改成了列出所有描述,然后选择描述名称,通过描述名称设置枚举值,即后文将介绍的枚举的扩展用法)

枚举值自己定义,可以从零开始(默认也是0),下一个变量如果没有指定值则为上一个变量值+1,如上例中“版本2007”的值为1.

枚举转换:

1 Version_Type  myVersion = Version_Type.版本1997;
2 byte version = (byte)myVersion;//获取值
3 myVersion = (Version_Type )version;//获取枚举
4 string versionName = myVersion.ToString();//获取枚举名称
5 versionName = Convert.ToString(myVersion);//获取枚举名称和上一个一样
6 string versionName1 = "版本2007";
7 Version_Type  myVersion1 = (Version_Type )Enum.Parse(typeof(Version_Type),versionName1);//通过枚举名称获取枚举

枚举扩展用法,通过枚举描述设置枚举值:

这个方法关键还是对枚举描述和枚举变量进行记录。

创建一个Dictionary全局对象:

private Dictionary<int,Dictionary<string,string>> enumValue;

int是用来存放属性索引,表示第i个属性。中间的Dictionary用来存放枚举描述和枚举变量名称,一一对应!

Type t = spec.GetType();//获取类型
for(int i=0;i<GetProperties().Getlength(0);i++)
{
   string text = pi.GetValue(spec,null).ToString();
   //其它执行代码
   ....
   //如果是枚举类型
   if(pi.PropertyType.BaseType.Name == "Enum")
   {
    //创建ComboBoxCell
    ...
    //创建Dictionary 记录描述和属性的键值对
    Dictionary<string,string> itemEnum = new Dictionary<string,string>();
    //属性添加到  ComboBoxCell中
    foreach(var fi in pi.PropertyType.GetFields(BindingFlags.Static |  BindingFlags.Public))
        {
              /********上篇文章用法**********
             string text = fi.Name;
             //text添加到控件中
              ****************************/
              object[] objs = fi.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute),false);
              if(objs != null)
                  {
                         //获取描述
                          string strDescription = ((System.ComponentModel.DescriptionAttribute)objs[0]).Description;
                         //添加描述到控件中
                          ...
                         //集合中添加简直对
                         itemEnum.Add(strDescription,fi.Name);
                          continue;
                  }
              //如果没有描述的情况
              string strText = fi.Name;
              //就用属性自己构成键值对
              itemEnum.Add(strText,strText);
         }
          EnumValue.Add(i,itemEnum);
     }
}

当DataGridView中某一项改变的时候,在CellValidating事件处理函数中取出索引,取出要改变的值

string strValue = e.FormattedValue.ToString();
int index = e.RowIndex;
string strValueSet = "";
//获取描述对应的枚举属性
if(EnumValue.ContainsKey(index))
{
    strValueSet = EnumValue[index][strValue];
}
//后面修改值代码
时间: 2024-10-31 15:26:20

C#枚举总结和其扩展用法(通过枚举描设置枚举值)的相关文章

grep的扩展用法

正则表达式分为基本的正则表达式和扩展的正则表达式. 通常情况下,grep使用的是基本的正则表达式,如果要使用扩展的正则表达式,可以用-E选项,等同于egrep grep的其他一些选项: -A n:显示匹配行后面的n行,(after). -B n:显示匹配行前面的n行,(before). -C n:显示前后各n行.(context) 示例1: [[email protected] tmp]# grep --color -A 1 '^cpu MHz' /proc/cpuinfo  cpu MHz  

枚举常见的七种用法

DK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持

vue自定义指令clickoutside使用以及扩展用法

vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如要求选择器的弹出框中,增加搜索过滤(跟目前element的输入建议不太一样).于是想说说之前修改element组件,并定制为业务组件过程中遇到的问题. ps:因为对某些组件改动很大,所以是直接拷贝了一份源码,然后再进行修改,但是这样会遇到挺多问题,建议对于vue组件如果改动不大,只是简单功能扩展,就

编程题:为枚举类型变量赋值。将整型值强制类型转换成枚举类型赋值

编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值 #include<stdio.h> void main() { enum season {spring,summer,autumn,winter}s1,s2; s1=summer; s2=(enum season)2; printf("s1=%d,s2=%d\n",s1,s2); } 编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值,布布扣,bubuko.com

delphi CXGRID用法 (取行、列值;定位选中某行等等)

CXGRID用法 (取行.列值:定位选中某行等等) Delphi Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值 cxGrid1DBTableView1.Controller.FocusedRowIndex 当前行号 cxGrid1DBTableView1.Controller.FocusedRow 当前行 cxGrid1DBTableView1.Controller.FocusedColumn 当前列 cxGrid1DBTableView1.Controller.Focused

DELPHI设置枚举类型size

delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度,小至1个字节,大至4个字节. 官方说明如下: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/comp

Android之ExpandableList扩展用法(基于BaseExpandableListAdapter)

1.简介 基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两个数组,第一个是表示Group(目录头)信息的一维数组,第二个是表示Child(目录子项)的二维数组数组:第二种是构建两个类,一个是表示目录信息的GroupInfo类,另一个是表示子项信息的ChildInfo类,然后传入BaseExpandableListAdapter.通过对比发现,第一种方法由于

枚举的意义,用途,作用,用法,作用场景

下面给出在枚举中声明属性和方法的示例: package com.fhp.enumexample; public enum TypeEnum { VIDEO(1), AUDIO(2), TEXT(3), IMAGE(4); int value; TypeEnum(int value) { this.value = value; } public int getValue() { return value; } } 在这个枚举中,每个枚举的值都有一个对应的int型字段,而且不同的枚举值也会有不同的i

文本处理命令系列——grep的扩展用法

正则表达式分为基本的正则表达式和扩展的正则表达式. 通常情况下,grep使用的是基本的正则表达式,如果要使用扩展的正则表达式,可以用-E选项,等同于egrep grep的其他一些选项: -A n:显示匹配行后面的n行,(after). -B n:显示匹配行前面的n行,(before). -C n:显示前后各n行.(context) 示例1: [[email protected] tmp]# grep --color -A 1 '^cpu MHz' /proc/cpuinfo cpu MHz