- 浏览: 78807 次
文章分类
- 全部博客 (48)
- AOP (0)
- ASP.NET (1)
- C# (0)
- Community Server (0)
- Database (0)
- Design Pattern (3)
- JAVA (1)
- JavaScript (1)
- Linux (1)
- O/R Mapping (0)
- OO (3)
- SQL Server (1)
- VB.NET (0)
- Visual Studio 2005 (2)
- Windows (2)
- WPF (0)
- XML/XSLT (0)
- 常用工具类 (0)
- 人生感悟 (0)
- 算法 (0)
- 转载 (5)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (3)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (15)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (2)
- [网站分类]4.其他技术区 (4)
- [网站分类]5.企业信息化 (0)
- [网站分类]6.读书心得区(技术书籍阅读心得、书籍推荐) (0)
- [网站分类]7.提问区(.NET技术方面的提问) (0)
- [网站分类]8.技术转载区(.NET技术文章转载, 请注明原文出处) (1)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [网站分类]Dottext区 (0)
- [网站分类]GIS技术 (0)
- [网站分类]IT英才专区(IT职场交流) (0)
- [网站分类]SharePoint (0)
- [网站分类]博客园.NET俱乐部(俱乐部组织与活动方面的文章) (0)
- [网站分类]软件发布区(发布自己开发的代码、软件) (0)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (0)
- [网站分类]业界新闻 (0)
最新评论
-
xjw1987524:
这个问题我是弄啦很久,我也试过反编译,不知道为什么就是不成功; ...
支持中文参数的 jspSmartUpload
声明:
本文内容出自:http://www.codeproject.com/useritems/DotNetEnumsNextLevel.asp
由于本人E文菜得实在离谱,对文章的“翻译”①仅限于自娱自乐,文中用词过于牵强而且漏洞百出,强烈建议读者打开上面的链接阅读原文。
-------------------------------------------------------------
导言
在这篇文章里我将对.NET中的枚举做进一步探索,本文不会含盖枚举的基本概念、语法或者使用方法(这些你可以通过MSDN得到详细的信息),最大的限制是枚举只能使用 Integer 数据类型。枚举提供了 ToString() 方法的支持,但却有限制(我会在文章后面详细论述)。主要地,我希望能够把我所列举的枚举元素不仅仅关联到整数数据,我将通过反射(Reflection)和属性(Attributes)跟使用尽量简单的例子来说明如何达到这一目标。
在 Enum 中使用 ToString()
我们先来创建一个简单的枚举。。。
{
RegularEmployee,
StoreManager,
ChainStoreManager,
DepartmentManager,
Supervisor
}
我们可以通过 ToString() 方法简单地获取到下列信息
Console.WriteLine(employee.ToString());
Console.WriteLine(EmployeeType.ChainStoreManager.ToString());
/**//*
输出结果:
ChainStoreManager
ChainStoreManager
*/
但我们如何才能获取到的结果类似“Chain Store Manager”包括空格呢?我们不能去创建一个包含空格的枚举成员,否则你的代码将不能编译通过,事实上我们有很多方案可以解决这个问题。
1、在枚举成员和字符串之间创建一个映射(可以使用数组或哈希表)
2、将枚举成员 ToString() 的结果作为为键指定到资源文件
3、使用反射。。。。(我将在下面讲到)
在枚举中使用属性
我将使用属性来达到一个字符串关联到枚举成员的目的,下面通过一个简单的例子来说明这是如何做到的。
{
private string m_strDescription;
public EnumDescriptionAttribute(string strPrinterName)
{
m_strDescription = strPrinterName;
}
public string Description
{
get { return m_strDescription; }
}
}
EnumDescriptionAttribute 类继承自 Attribute,它包含一个类型为String的属性Description,下面将该属性关联到枚举 EmployeeType 的所有成员上。
{
[EnumDescription("Regular Employee")]
RegularEmploye,
[EnumDescription("Store Manager")]
StoreManager,
[EnumDescription("Chain Store Manager")]
ChainStoreManager,
[EnumDescription("Department Manager")]
DepartmentManager,
[EnumDescription("On Floor Supervisor")]
Supervisor
}
从枚举获取到属性的值
为了获取到属性的值,我必须使用到反射,下是是一个简单的例子:
EmployeeType employee = EmployeeType.ChainStoreManager;
// get the field informaiton
FieldInfo fieldInfo = employee.GetType().GetField("ChainStoreManager");
// get the attributes for the enum field
object[] attribArray = fieldInfo.GetCustomAttributes(false);
// cast the one and only attribute to EnumDescriptionAttribute
EnumDescriptionAttribute attrib = (EnumDescriptionAttribute)attribArray[0];
// write the description
console.WriteLine("Description: {0}", attrib.Description);
/**//*
输入结果:
Chain Store Manager
*/
其中最重点的一行代码:FieldInfo fieldInfo = employee.GetType().GetField("ChainStoreManager"); 我们注意硬编码到里面的枚举成员名称ChainStoreManager实际上可以通过 ToString() 方法来代替。
一个获取描述信息的通用方法
其中使用了 ToString() 方法
{
System.Reflection.FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return String.Empty;
}
else
{
EnumDescriptionAttribute attrib = attribArray[0] as EnumDescriptionAttribute;
return attrib.Description;
}
}
让枚举成员关联到更多的数据类型
到目前为止我们仅仅在我们的枚举成员中添加了描述信息,不过我们是完全可以让我们的枚举关联到任何一种数据类型的,我交将创建一个新的枚举来展示我的想法(这跟前面的做法一样)。
{
StoreManager,
ChainManager,
Superivor
}
而且我还得创建一个 EnumDescription 的派生类 ManagerAttribute,跟提供两个价格信息(最高和最低薪水值)
{
private int m_intMinSalary;
private int m_intMaxSalary;
public ManagerAttribute(string strDescription, int intMinSalary, int intMaxSalary)
: base(strDescription)
{
m_intMinSalary = intMinSalary;
m_intMaxSalary = intMaxSalary;
}
public ManagerAttribute(string strDescription)
: base(strDescription)
{
}
public int MinSalary
{
get { return m_intMinSalary; }
set { m_intMinSalary = value; }
}
public int MaxSalary
{
get { return m_intMaxSalary; }
set { m_intMaxSalary = value; }
}
}
现在我将 ManagerAttribute 关联到所有枚举成员上,为了让代码的可读性更强,给 ManagerAttributes 的所有属性都附了值。
{
[Manager("Store Manager", MinSalary=40000, MaxSalary=100000)]
StoreManager,
[Manager("Chain Manager", MinSalary=50000, MaxSalary=110000)]
ChainManager,
[Manager("Store Supervisor", MinSalary=30000, MaxSalary=50000)]
Superivor
}
下一步是改进获取 EnumDescriptionAttribute 属性值的通用方法,让它支持所有数据类型,使用C# 2.0 中的泛型(Generics)很容易办到
{
// get field informaiton for our enum element
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
// get all the attributes associated with our enum
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
return default(T);
else
{
// cast the attribute and return it
T attrib = (T)attribArray[0];
if (attrib != null)
return attrib;
else
return default(T);
}
}
工具方法
到目前为止我们已经写了两个工具类,一个是简单地实现了从枚举中获取描述信息,另一个继承自 EnumDescriptionAttribute 的更通用的方法可以获取任何数据类型的属性值,你可以把它们添加到你的枚举工具类(如:EnumHelper)中去,这里我还是简单地把它放在 EnumDescriptionAttribute 中。
{
private string m_strDescription;
public EnumDescriptionAttribute(string strEnumDescription)
{
m_strDescription = strEnumDescription;
}
public string Description { get { return m_strDescription; } }
public static string GetEnumDescription(Enum enumObj)
{
System.Reflection.FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
return String.Empty;
else
发表评论
-
获取某目录下的所有文件(包括子目录下文件)的数量(C#)
2005-11-04 17:27 3993以前写过一个通过计算目录遍历所有文件和子目录的方法来获得某目录 ... -
Visual Studio 2005 试用笔记
2005-11-06 21:36 938今天开始用上了 VS 2005 ... -
C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
2005-11-09 22:52 1315(很喜欢李建忠老师的这个讲座,可惜暂时没更多的了,继续关注 M ... -
利用视图管理器高效编写 SQL SELECT 语句
2006-02-19 13:27 961献给初学者,老鸟别扔砖头 编写 ... -
将Web站点下的绝对路径转换为虚拟路径
2006-05-07 12:48 1209很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法 ... -
比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
2006-05-13 22:17 4048有时候我们需要从两个不同数组中提取出相同的部分 ... -
基于 .NET 2.0 System.Net.Mail namespace 的邮件发送组件
2006-05-17 13:11 1888一个基于 .NET 2.0 System.Net.Mail n ... -
从 CCS 1.1 升级到 CS 2.0 所遇到的问题和部分解决方法
2006-06-16 12:58 829整理了一下,记录在这 ... -
C# 中实现随机时间的获取
2006-09-07 17:31 1368原理其实非常简单,取出两个时间差的秒数,再在0到该秒数 ... -
NHibernate 实体类中重写 Equals() 和 GetHashCode()
2006-09-17 17:08 1553在正常的对象操作中,当两个对象都是通过 new ... -
初识 db4o
2006-10-25 21:41 942今天早上收到 IBM developerWork ... -
Spring.Net AOP 学习之旅: 使用 Throws Advice 处理异常
2006-10-30 21:12 4339写在前头:本文示例和部分文字来自《Sprin ... -
.NET 1.1 下不使用 System.Web.Mail.SmtpMail 发送邮件的其它选择
2006-12-22 20:35 1246最近工作原因需要维护 ASP.NET 1.1 的程 ... -
.NET 中的 委托与事件
2006-12-27 10:10 1933一、什么是委托 ...
相关推荐
.NET 获取枚举 DescriptionAttribute 描述信息性能改进的多种方法 在 ASP.NET 编程中,获取枚举 DescriptionAttribute 描述信息是一个常见的需求。DescriptionAttribute 特性可以用于 many places,例如枚举,通过...
在VB.NET中,"枚举(Enum)"是一个重要的数据类型,它允许我们定义一组命名的常量。这些常量便于编程,因为它们提供了可读性更强的代码,同时减少了因手动输入错误值而导致的潜在错误。枚举是基于特定的基础数据类型...
本章节摘自《Programming the .NET Compact Framework in VB》一书的第三章,作者为Paul Yao与David Durant。该章节主要介绍了.NET Compact Framework中的数据类型系统,是理解.NET编程中类型处理的基础。 #### 二...
在VB.NET编程环境中,与USB设备进行交互是一个常见的任务,特别是在开发硬件驱动或者控制系统时。本文将详细讲解如何使用VB.NET来实现USB接口的数据读写,并自动检测USB设备的在线状态。 首先,我们需要理解USB通信...
VB.NET 是一种面向对象的编程语言,其数据类型是编程的基础,用于定义变量的存储和行为。本篇文章将深入探讨VB.NET中的基本数据类型,包括字符类型、数值类型和其他特定类型,以及枚举类型和用户自定义类型的使用。 ...
VB.Net 的基本语法结构包括Imports、Namespace、Class、Module、Interface、Enum、Delegate 等。其中,Imports 语句用于引入外部命名空间,Namespace 用于定义命名空间,Class 用于定义类,Module 用于定义模块,...
public enum PlayerStatus { Active, Injured, Retired } ``` 然后,在处理DOM时,可以用这个枚举来设置或检查球员的状态属性。 总的来说,`.NET平台DOM解析实例`涵盖了XML解析的基础知识,包括加载XML、遍历DOM...
VB.NET 是一种面向对象的编程语言,用于开发Windows应用程序。在VB.NET中,复合数据类型是数据结构的重要组成部分,它们允许我们存储和处理多个数据项。本教学课件主要介绍了四种复合数据类型:数组、结构、枚举和...
在VB.NET编程中,"获取窗体句柄并编辑文本和触发事件"是一个常见的操作,尤其是在需要对已运行的应用程序进行自动化控制或者扩展功能时。窗体句柄(HWND)是Windows操作系统中用来唯一标识一个窗口的对象,它就像是...
6. **枚举(ENUM)**: 枚举是一种常量集合,选项C错误是因为不能直接赋值整数5给枚举变量,而应使用枚举成员。 7. **数组声明**: 正确的数组声明是选项A,其他选项没有正确初始化数组或语法错误。 8. **引用参数(REF...
例如,`Enum Days Sunday, Monday, Tuesday=7, Saturday=6 End Enum`定义了一个名为Days的枚举,其中包含了代表一周中每一天的常量。 5. 结构类型: - 结构是自定义数据类型,可以包含多种不同数据类型的成员。如`...
【VB.NET源码】全局鼠标 在VB.NET编程中,有时候我们需要实现全局鼠标事件的监听,比如跟踪鼠标的移动、点击等操作,即使鼠标焦点不在我们的应用程序上也能够捕获这些事件。这就是全局鼠标钩子(Global Mouse Hook...
2. 枚举与结构:枚举(Enum)用于定义一组相关的命名常量,方便代码的可读性。结构(Structure)是一种轻量级的数据类型,不同于类,它们是值类型,适用于存储简单数据。 3. 泛型:泛型允许在不指定具体类型的情况...
C#.NET 编程规范是指导开发者遵循的一套标准,以确保代码的可读性、可维护性和一致性。本文档主要介绍了C#.NET中的命名约定、注释规范以及一些基本的编程实践。 **命名约定** 1. **PascalCase 和 CamelCase**: -...
4. **枚举操作**:枚举在.NET中是类型安全的,可以用Enum.Parse或Enum.TryParse方法将字符串转换为枚举值,或者用Enum.GetNames和Enum.GetValues方法获取枚举的所有成员。 5. **缓存管理**:ASP.NET提供HttpRuntime...
C#.Net是微软公司推出的一种面向对象的编程语言,它基于.NET Framework或.NET Core平台,广泛应用于构建桌面应用、Web应用、移动应用以及游戏开发等多个领域。C#.Net的开发规范是为了确保代码的质量、可读性、可维护...
### VB.NET 和 C# 语法比较 #### 概述 本文档主要针对 VB.NET 和 C# 的语法进行了详细的对比分析,旨在为从 VB.NET 转向 C# 的开发者提供便利,帮助他们更快地掌握 C# 的语法特点,并能够顺利过渡到新的编程环境中...
- 枚举(Enum):了解如何创建和使用枚举类型。 - 委托(Delegate)与事件(Event):用于处理异步操作和回调机制。 - Lambda表达式:简化匿名方法的编写,常用于LINQ查询。 - 异常处理:掌握try-catch-finally...
- 枚举(Enum)和结构(Struct):了解它们的区别,何时使用枚举,何时选择结构。 - 异常处理:理解try-catch-finally语句块,以及如何自定义异常。 - 泛型:了解泛型的作用,如减少类型转换,提高代码复用。 2....
VB.NET使用关键字`Dim`声明变量,`If...Then...Else`进行条件判断,`For...Next`和`While...End While`用于循环。 ### 3. 类与对象 在VB.NET中,类是创建对象的蓝图,而对象是类的实例。通过`Class`关键字定义类,...