C# 知识特性 Attribute

C#知识--获取特性 Attribute

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

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

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

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

 1         /// <summary>
 2         /// 获取特性值方法
 3         /// </summary>
 4         /// <param name="t"></param>
 5         /// <returns></returns>
 6         public static string OutputDescription(Type t)
 7         {
 8             var attributes = t.GetCustomAttributes();
 9             foreach (Attribute attribute in attributes)
10             {
11                 var attr = attribute as DescriptionAttribute;
12                 if (attr != null)
13                 {
14                     return attr.Description;
15                 }
16             }
17             return t.ToString();
18         }

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

  1 /// <summary>
  2     /// 第一种获取特性值,适用只有单个特性
  3     /// </summary>
  4     public static class FingerGuessingGameTypeExtension
  5     {
  6         public static string GetEnumDescription(this FingerGuessingGameType enumType)
  7         {
  8             Type type = enumType.GetType();
  9             MemberInfo[] memberInfo = type.GetMember(enumType.ToString());
 10             if (memberInfo != null && memberInfo.Length > 0)
 11             {
 12                 object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
 13                 if (attrs != null && attrs.Length > 0)
 14                 {
 15                     return ((DescriptionAttribute)attrs[0]).Description;
 16                 }
 17             }
 18
 19             return enumType.ToString();
 20         }
 21
 22         public static string GetEnumValue(this FingerGuessingGameType enumType)
 23         {
 24             Type type = enumType.GetType();
 25             MemberInfo[] memberInfo = type.GetMember(enumType.ToString());
 26             if (memberInfo != null && memberInfo.Length > 0)
 27             {
 28                 object[] attrs = memberInfo[0].GetCustomAttributes(typeof(NameAttribute), false);
 29                 if (attrs != null && attrs.Length > 0)
 30                 {
 31                     return ((NameAttribute)attrs[0]).Name;
 32                 }
 33             }
 34
 35             return enumType.ToString();
 36         }
 37     }
 38     /// <summary>
 39     /// 第二种获取特性值,适用有多个特性
 40     /// </summary>
 41     public static class FingerExtension
 42     {
 43         private static Dictionary<Enum, ValueDescriptionPair> m_Dic=null;
 44
 45         public static string GetDescription(this FingerGuessingGameType enumType)
 46         {
 47             if (m_Dic == null)
 48             {
 49                 Type type = enumType.GetType();
 50                 var allValues = Enum.GetValues(type).OfType<Enum>();
 51                 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p));
 52             }
 53
 54             ValueDescriptionPair valueDescription;
 55             if (m_Dic.TryGetValue(enumType, out valueDescription))
 56             {
 57                 return valueDescription.Description;
 58             }
 59             return enumType.ToString();
 60         }
 61
 62         public static string GetValue(this FingerGuessingGameType enumType)
 63         {
 64             if (m_Dic == null)
 65             {
 66                 Type type = enumType.GetType();
 67                 var allValues = Enum.GetValues(type).OfType<Enum>();
 68                 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p));
 69             }
 70
 71             ValueDescriptionPair valueDescription;
 72             if (m_Dic.TryGetValue(enumType, out valueDescription))
 73             {
 74                 return valueDescription.Name;
 75             }
 76             return enumType.ToString();
 77         }
 78
 79         private static ValueDescriptionPair GetDescriptionValue(Type type, Enum value)
 80         {
 81             var valueDescriptionPair=new ValueDescriptionPair();
 82             var enumName=Enum.GetName(type,value);
 83             var description=type.GetField(enumName)
 84                 .GetCustomAttributes(typeof (DescriptionAttribute), false)
 85                 .OfType<DescriptionAttribute>().FirstOrDefault();
 86             var enumValue = type.GetField(enumName)
 87                 .GetCustomAttributes(typeof(NameAttribute), false)
 88                 .OfType<NameAttribute>().FirstOrDefault();
 89
 90             if (description != null)
 91             {
 92                 valueDescriptionPair.Description = description.Description;
 93             }
 94             if (enumValue != null)
 95             {
 96                 valueDescriptionPair.Name = enumValue.Name;
 97             }
 98             return valueDescriptionPair;
 99         }
100     }
101
102     public class NameAttribute:Attribute
103     {
104         public NameAttribute(string name)
105         {
106             Name = name;
107         }
108         public string Name { get; set; }
109     }
110
111     public class ValueDescriptionPair
112     {
113         //Description 特性
114         public string Description { get; set; }
115         //Value 特性
116         public string Name { get; set; }
117     }

时间: 2024-10-10 20:37:04

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

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

剖析 AssemblyInfo.cs - 从这里了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 上次,我们通过<C# 知识回顾 - 特性 Attribute>已经了解如何创建和使用特性 Attribute,这次,让我们一起来看看每次使用 VS 创建项目时所自带的文件 AssemblyInfo.cs. 目录 核心代码 展开图中的代码,看箭头↓ using System.Reflecti

C# 自定义特性Attribute

一.特性Attribute和注释有什么区别 特性Attribute A:就是一个类,直接继承/间接继承Attribute B:特性可以在后期反射中处理,特性本身是没有什么*用的 C:特性会影响编译和运行时功能 注释 A:就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提示,能提高程序代码的可读性 B:注释不能后期处理 二.自定义Attribute特性的使用 自定义Attribute特性的语法 其实特性就是一个类,直接继承

.NET基础编程之特性 - Attribute

这一篇文章是给大家介绍的是:.NET基础编程之特性 - Attribute,对这一部分掌握不熟悉的同学,可以仔细的看一下! 一.特性简介 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用"反射"查询特性. 特性具有以下属性: (1)特性可向程序中添加元数据.元数据是有关在程序中定义的类型的信息.所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员.可以添加自定义特性,以

.NET特性-Attribute

两篇文章有助于学习Attribute特性的概念. http://blog.csdn.net/byondocean/article/details/6802111 http://www.cnblogs.com/JimmyZhang/archive/2008/01/27/1055254.html .NET特性-Attribute

.Net内置特性Attribute介绍

特性Attribute概述 特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块.类.接口.结构.构造函数.方法.字段等,加载了特性的类型称之为特性的目标.这里为与属性(Property)区分,所以称之为特性(Attribute).特性是为程序集添加元数据的一种机制,通过它可以为编译器提供指示或者对数据进行说明.例如前段时间学习的Remoting技术(主要用于应用程序域之间的对象通信)中在应用程序域间的引用对象时该对象具有序列化(Serializabl

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

其实attribute和property两个单词,翻译出来都是属性,但是<javascript高级程序设计>将它们翻译为特性和属性,以示区分.本文将详细介绍特性和属性的不同之处 定义 元素特性attribute是指HTML元素标签的特性 下面的id.class.title.a都是特性,其中a叫做自定义特性 <div id="id1" class="class1" title="title1" a='a1'></div

.net之特性(Attribute)

看了一些关于这方面的文档,自我总结: 特性(Attribute)就是对一个方法或类做的一个额外的属性说明,也就是附加说明 下面是我自己抄的一个实例程序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace SomeTest { class Program { static void Main(string[]

C# 特性(Attribute)(二)

AttributeUsage类是另外一个预定义特性类,它帮助我们控制我们自己的定制特性的使用.它描述了一个定制特性如和被使用.    AttributeUsage有三个属性,我们可以把它放置在定制属性前面.第一个属性是:    ValidOn    通过这个属性,我们能够定义定制特性应该在何种程序实体前放置.一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出.通过OR操作我们可以把若干个AttributeTargets值组合起来.    AllowMu

C# 特性(Attribute)(一)

特性(Attributes)是一种崭新的声明性信息.我们不仅可以通过特性来定义设计层面的信息(例如help file, URL for documentation)以及运行时(run-time)信息(例如使XML与class相联系),而且我们还可以利用特性建立自描述(self- describing)组件.在这篇教程中,我们将会看到如何建立和添加特性到各种程序实体以及如何在运行时环境中获取特性信息.   定义   正如MSDN中所描述的那样-----     “特性是被指定给某一声明的一则附加的