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# 知识特性 Attribute,XMLSerialize,

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

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

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

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

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

  4. C# 自定义特性Attribute

    一.特性Attribute和注释有什么区别 特性Attribute A:就是一个类,直接继承/间接继承Attribute B:特性可以在后期反射中处理,特性本身是没有什么*用的 C:特性会影响编译和运 ...

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

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

  6. .Net内置特性Attribute介绍

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

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

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

  8. 理解特性attribute 和 属性property的区别 及相关DOM操作总结

    查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点:  ...

  9. 如何获取类或属性的自定义特性(Attribute)

    如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...

随机推荐

  1. 父ListView嵌套子ListView时点击事件没有响应

    转发请备注出处:http://www.cnblogs.com/LT5505/p/5972999.html 问题: 在ListView中嵌套ListView之后,子ListView会把父ListView ...

  2. 萌新笔记——linux下(ubuntu)反删除(误删恢复)与回收站制作

    刚刚有个小伙伴不小心删了他写了好几的天代码,为他心疼之余帮他找回了文件. 想到我之前也常常误删一些文件,就干脆分享一下我的反删除方法,并说说我做的回收站(好low的,求大神指点) 首先是反删除软件ex ...

  3. 第18章 图元文件_18.2 增强型图元文件(emf)(2)

    18.2.7 增强型图元文件的查看和打印程序 (1)传递EMF到剪贴板,剪贴板类型应为:CF_ENHMETAFILE (2)CopyEnhMetaFile用于复制图元文件 (3)剪贴板中的图元文件会自 ...

  4. MDIO/MDC(SMI)接口

    转载:http://blog.chinaunix.net/uid-24148050-id-132863.html 1. 简介 The MDIO interface is a simple, two-w ...

  5. SKPhysicsBody类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framewo ...

  6. grok 正则解析日志例子&lt;1&gt;

    <pre name="code" class="html">下面是日志的样子 55.3.244.1 GET /index.html 15824 0. ...

  7. 如何用C#寻找100到999的所有水仙花数?

    首先解释一下何为水仙花数:水仙花数只是自幂数的一种,严格来说是三位数的个位.十位.百位的3次幂数相加等于原来的数字,称为水仙花数.(例如:1^3 + 5^3+ 3^3 = 153) 那么如何通过C#语 ...

  8. Shell中bash的特性小结

    Shell: 用户与操作系统之间完成交互式操作的一个接口程序,为用户提供简化了的操作:上世纪的70年代中期在贝尔实验室,Bourne位Unix开发了一个shell程序Bourne Shell,简称sh ...

  9. Spring MVC 使用介绍(十四)文件上传下载

    一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...

  10. JIRA笔记(一):安装部署JIRA

    (一)     说明 说明JIRA的安装及破解. 操作系统:WIN 10 数据库:Oracle 12C R2(这个版本的jira,atlassian建议的是 12C R1,不过R2也能用,其他版本不清 ...