C#知识--获取特性 Attribute

特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,可在运行时使用“反射”查询特性,获取特性集合方法是GetCustomAttributes();

根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。但是,在代码中使用特性时,不需要指定 attribute 后缀。在声明特性类时要以“Attribute”结束,使用时省略“Attribute”单词。

下面是几种使用特性的方法,菜鸟只是多看了一下总结一下,大神可以绕过:

类、程序集上的特性采用方法:

         /// <summary>
         /// 获取特性值方法
         /// </summary>
         /// <param name="t"></param>
         /// <returns></returns>
         public static string OutputDescription(Type t)
         {
             var attributes = t.GetCustomAttributes();
             foreach (Attribute attribute in attributes)
             {
                 var attr = attribute as DescriptionAttribute;
                 if (attr != null)
                 {
                     return attr.Description;
                 }
             }
             return t.ToString();
         }

方法、属性采用扩展方法:

 /// <summary>
     /// 第一种获取特性值,适用只有单个特性
     /// </summary>
     public static class FingerGuessingGameTypeExtension
     {
         public static string GetEnumDescription(this FingerGuessingGameType enumType)
         {
             Type type = enumType.GetType();
             MemberInfo[] memberInfo = type.GetMember(enumType.ToString());
             )
             {
                 ].GetCustomAttributes(typeof(DescriptionAttribute), false);
                 )
                 {
                     ]).Description;
                 }
             }

             return enumType.ToString();
         }

         public static string GetEnumValue(this FingerGuessingGameType enumType)
         {
             Type type = enumType.GetType();
             MemberInfo[] memberInfo = type.GetMember(enumType.ToString());
             )
             {
                 ].GetCustomAttributes(typeof(NameAttribute), false);
                 )
                 {
                     ]).Name;
                 }
             }

             return enumType.ToString();
         }
     }
     /// <summary>
     /// 第二种获取特性值,适用有多个特性
     /// </summary>
     public static class FingerExtension
     {
         private static Dictionary<Enum, ValueDescriptionPair> m_Dic=null;

         public static string GetDescription(this FingerGuessingGameType enumType)
         {
             if (m_Dic == null)
             {
                 Type type = enumType.GetType();
                 var allValues = Enum.GetValues(type).OfType<Enum>();
                 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p));
             }

             ValueDescriptionPair valueDescription;
             if (m_Dic.TryGetValue(enumType, out valueDescription))
             {
                 return valueDescription.Description;
             }
             return enumType.ToString();
         }

         public static string GetValue(this FingerGuessingGameType enumType)
         {
             if (m_Dic == null)
             {
                 Type type = enumType.GetType();
                 var allValues = Enum.GetValues(type).OfType<Enum>();
                 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p));
             }

             ValueDescriptionPair valueDescription;
             if (m_Dic.TryGetValue(enumType, out valueDescription))
             {
                 return valueDescription.Name;
             }
             return enumType.ToString();
         }

         private static ValueDescriptionPair GetDescriptionValue(Type type, Enum value)
         {
             var valueDescriptionPair=new ValueDescriptionPair();
             var enumName=Enum.GetName(type,value);
             var description=type.GetField(enumName)
                 .GetCustomAttributes(typeof (DescriptionAttribute), false)
                 .OfType<DescriptionAttribute>().FirstOrDefault();
             var enumValue = type.GetField(enumName)
                 .GetCustomAttributes(typeof(NameAttribute), false)
                 .OfType<NameAttribute>().FirstOrDefault();

             if (description != null)
             {
                 valueDescriptionPair.Description = description.Description;
             }
             if (enumValue != null)
             {
                 valueDescriptionPair.Name = enumValue.Name;
             }
             return valueDescriptionPair;
         }
     }

     public class NameAttribute:Attribute
     {
         public NameAttribute(string name)
         {
             Name = name;
         }
         public string Name { get; set; }
     }

     public class ValueDescriptionPair
     {
         //Description 特性
         public string Description { get; set; }
         //Value 特性
         public string Name { get; set; }
     }

C# 知识特性 Attribute的更多相关文章

  1. [C#] C# 知识回顾 - 特性 Attribute

    C# 知识回顾 - 特性 Attribute [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5911289.html 目录 特性简介 使用特性 特性 ...

  2. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

  3. 区分元素特性attribute和对象属性property

    × 目录 [1]定义 [2]共有 [3]例外[4]特殊[5]自定义[6]混淆[7]总结 前面的话 其实attribute和property两个单词,翻译出来都是属性,但是<javascript高 ...

  4. .Net内置特性Attribute介绍

    特性Attribute概述 特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块.类.接口.结构.构造函数.方法.字段等,加载了特性的类型称之为特性的目标. ...

  5. 【点滴积累】通过特性(Attribute)为枚举添加更多的信息

    转:http://www.cnblogs.com/IPrograming/archive/2013/05/26/Enum_DescriptionAttribute.html [点滴积累]通过特性(At ...

  6. 特性 Attribute

    特性就是一个类,必须是Attribute的子类 一般以Attribute结尾,然后在使用的时候,可以去掉这个结尾 可以在特性中声明字段.属性.方法.构造函数.委托.事件... [AttributeUs ...

  7. 【C#进阶系列】18 特性Attribute

    这个东西有的叫定制特性,然而我喜欢直接叫特性,但是这样的话一些人不知道我说的是什么,如果我说是Attribute的话那么知道的或者用过的就都懂了. 还记得讲到枚举和位标志那一章,关于位标志,有一个[F ...

  8. 优化特性(Attribute)性能

    通过这篇文章,不仅可以了解到Attribute的工作原理,还可以了解到GetcustomeAttribute是的内部执行流程.最后,你会看到,使用缓存机制可以极大的优化反射Attribute的性能. ...

  9. C# 特性 Attribute

    特性就是在类的类名称.属性.方法等上面加一个标记,使这些类.属性.方法等具有某些统一的特征,从而达到某些特殊的需要.举个小栗子:方法的异常捕捉,你是否还在某些可能出现异常的地方(例如数据库的操作.文件 ...

随机推荐

  1. python语言中的编码问题(续)

    上文提到了python开发中非常重要的两处设置. 一个是编解码器的默认设置defaultencoding >>> import sys >>> sys.getdef ...

  2. 2、实现不同子网之间的信息交流(互相可以PING通)

    一.环境: 二个不同的虚拟子网 VMnet1: 192.168.155.0/24 VMnet8: 192.168.170.0/24 编辑 --> 虚拟网络编辑器 (查看自己的子网,相应修改就行) ...

  3. 项目总结---- imageLoder 的2个Bug解决方法、1.9.4如何选择性删除disk缓存和其它一些错误。

    我们不说废话,直接入主题,抓紧时间写完,好继续找bug... (PS:imageLoder的bug 百度不到的哦,不过我坚信我的观点没错) 版本1.9.2,1.9.4我没测试 1,imageLoder ...

  4. 【转】【MySql】脚本备份数据库

    #!/bin/bash #this is a script of mysql backup if [ ! -d /mydata/data1/backup ] ;then mkdir /mydata/d ...

  5. Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)

    Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...

  6. 如何让你的UWP应用程序无缝调用几何作图

    有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...

  7. linux下svn命令大全

    linux下svn命令大全 1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/p ...

  8. 面向对象的 JavaScript

    面向对象的javascript 一.创建对象 创建对象的几种方式: var obj = {}; var obj = new Object(); var obj = Object.create(fath ...

  9. centos mysql 操作

    安装mysqlyum -y install mysql-server 修改mysql配置 vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记 暂时修改一下编码(添加在密码下 ...

  10. Text selection in div(contenteditable) when double click

    背景: 在最近项目中,碰到一个问题:有一个可编辑的div需要双击时可编辑,blur或者回车时将编辑结果保存.你可能注意到双击时,文字会被选中,可编辑区域不会focus到光标位置.考虑到兼容性问题,写了 ...