快速业务通道

不可不知的C#基础应用-- Extension扩展方法

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-10

背景

前几天有同事问到我一个简单的功能, 就是当你使用枚举时如何给每个一元素增加描述字符串并且可以很容易的读取出来.

比如有一个枚举类型是列出对一个问题给出的选项(例如: 同意?不同意?中立?):

  public enum AssessmentAnswer
{
     Strongly_Disagree = 1,
     Disagree = 2,
     Neutral = 3,
     Agree = 4,
     Strongly_Agree = 5
}
当选择不同的答案时, 希望得到一些描述性的语句比方说: 1. "强烈的反对" 2. "反对" 3. "持中立观点" 4. "同意" 5. "完全的同意"   当然你可以建立一个数据库表格,存放这些信息, 但是我想起几年前,我在网上下载一个 EnumDescription 源码(忘记了是在哪里下载的), 就可以实现这一功能. 让我们一起来看看是怎么样用 Extension 做到的:  

实现

首先定义一个EnumDescription 类:  public class EnumDescription : Attribute
{
     public string Text
     {
         get { return _text; }
     } private string _text;

     public EnumDescription(string text)
     {
         _text = text;
     }
}    

注意它的父类是Attribute, 因为我们希望将描述的语句作为每一个对应元素的特性. 然后新建一个文件,命名EnumExtensions.cs

 

public static class EnumExtensions
{
    public static string ToDescription(this Enum enumeration)
    {
        Type type = enumeration.GetType();
        MemberInfo[] memInfo = type.GetMember(enumeration.ToString());

        if (null != memInfo && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumDescription), false);
            if (null != attrs && attrs.Length > 0)
                return ((EnumDescription)attrs[0]).Text;
        }

        return enumeration.ToString();
    }

在这里我们定义了一个扩展函数ToDescription, 就像所有的扩展函数一样,它的参数是类似(this …),

这个函数首先用GetType 得到了当前枚举的类型, 然后借助 GetMember按照元素的名字(值), 得到这个特定的元素, 最后用GetCustomAttributes 得到描述的内容.

 

这个扩展函数实现后,我们可以修改枚举的定义,加入描述:

public enum AssessmentAnswer
{
[EnumDescription("强烈的反对")]
Strongly_Disagree = 1,

   [EnumDescription("反对")]
    Disagree = 2,
    Neutral = 3,
    Agree = 4,
[EnumDescription("完全的同意")]
Strongly_A

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号