前言: 在c#开发中,有时候我们需要读取 Attribute中的信息(关于Attribute , 我自己把他理解成一个可以为类,属性标记的东西,这个标记可以为你提供一些关于类,方法,属性的额外信息)

我们如何获取这些标记的信息,如何获取自定义Attribute信息。

正文:

1.获取一个枚举的详细信息

假设我们有这样一个枚举

public enum Category
{
/// <summary>
/// 英语
/// </summary>
English,
/// <summary>
/// 汉语
/// </summary>
Chinese,
/// <summary>
/// 日语
/// </summary>
Japanese
}
现在我要获取每个枚举的描述信息。 如果你不了Attribute,或许你只能这样获取
static class Program
{
static void Main()
{
var category = Category.Chinese;
switch (category)
{
case Category.Chinese: Console.WriteLine("中文"); break;
case Category.English: Console.WriteLine("英文"); break;
case Category.Japanese: Console.WriteLine("日语"); break;
}
}
}

似乎几个Case语句也能完成任务。 但是如果枚举项个数超多,那这种写法无疑很丑陋。

----------------------------------华丽分割线------------------------------------

接下来探讨 Attribute的一种简单应用场景

修改枚举

public enum Category
{
/// <summary>
/// 英语
/// </summary>
[Description("西洋文")]
English,
/// <summary>
/// 汉语
/// </summary>
[Description("汉语")]
Chinese,
/// <summary>
/// 日语
/// </summary>
[Description("日本话")]
Japanese
}

每个枚举项加入System.ComponentModel命名空间的 DescriptionAttribute,不清楚可以msdn一下。

然后附上两个算我原创的类吧...记得层在公司使用过直接获取 Descripton标记的方法,但是没有源码,我花了一天时间来查询这个问题,终于写出了自己的帮助类.奉献给大家..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; namespace ZyTools
{
/// <summary>
/// 枚举帮助类
/// </summary>
public class EnumHelper
{
/// <summary>
/// 获取枚举项的Attribute
/// </summary>
/// <typeparam name="T">自定义的Attribute</typeparam>
/// <param name="source">枚举</param>
/// <returns>返回枚举,否则返回null</returns>
public static T GetCustomAttribute<T>(Enum source) where T : Attribute
{
Type sourceType = source.GetType();
string sourceName = Enum.GetName(sourceType, source);
FieldInfo field = sourceType.GetField(sourceName);
object[] attributes = field.GetCustomAttributes(typeof(T), false);
foreach (object attribute in attributes)
{
if (attribute is T)
return (T)attribute;
}
return null;
} /// <summary>
///获取DescriptionAttribute描述
/// </summary>
/// <param name="source">枚举</param>
/// <returns>有description标记,返回标记描述,否则返回null</returns>
public static string GetDescription(Enum source)
{
var attr = GetCustomAttribute<System.ComponentModel.DescriptionAttribute>(source);
if (attr == null)
return null; return attr.Description;
}
}
}

现在我们只需要,这样写代码了.

var category = Category.Chinese;

 Console.WriteLine(EnumHelper.GetDescription(category));

是不是很清爽 .希望本文对初学者有所帮助,来源于www.xiaoniusoft.com
,转摘请注明。爱编程爱生活!!!

.net c#获取自定义Attribute的更多相关文章

  1. 转:C#制作ORM映射学习笔记一 自定义Attribute类

    之前在做unity项目时发现只能用odbc连接数据库,感觉非常的麻烦,因为之前做web开发的时候用惯了ORM映射,所以我想在unity中也用一下ORM(虽然我知道出于性能的考虑这样做事不好的,不过自己 ...

  2. C#自定义Attribute值的获取与优化

    C#自定义Attribute值的获取是开发中会经常用到的,一般我们的做法也就是用反射进行获取的,代码也不是很复杂. 1.首先有如下自定义的Attribute [AttributeUsage(Attri ...

  3. 【MVC 笔记】MVC 自定义 Attribute 属性中的猫腻

    原想在 MVC Action 上加一个自定义 Attribute 来做一些控制操作,最先的做法是在自定 Attribute 中定义一个属性来做逻辑判断,可惜事与愿违,这个属性值居然会被缓存起来,于是于 ...

  4. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

  5. iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)

    如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarB ...

  6. XsdGen:通过自定义Attribute与反射自动生成XSD

    前言 系统之间的数据交互往往需要事先定义一些契约,在WCF中我们需要先编写XSD文件,然后通过自动代码生成工具自动生成C#对象.对于刚刚接触契约的人来说,掌握XMLSpy之类的软件之后确实比手写XML ...

  7. 2.C#自定义Attribute

    阅读目录    一:C#自定义Attribute    二:AttributeUsageAttribute中的3个属性(Property)中的AttributeTargets   三:Attribut ...

  8. 自定义Attribute 服务端校验 客户端校验

    MVC 自定义Attribute 服务端校验 客户端校验/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Autho ...

  9. IdentityServer4客户端如何获取自定义声明,了解一下?

    前言 久违了各位,之前录制过IdentityServer4的基础视频(https://space.bilibili.com/319652230/#/),有兴趣了解的童鞋可以看一下,只不过未发表成博客. ...

随机推荐

  1. UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

    有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *op ...

  2. maven -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME

    遇到错误:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME解决办法:在环境变量中设置M2_HO ...

  3. ROS_Kinetic_04 ROS基础内容(一)

    ROS_Kinetic_04 ROS基础内容(一) 在开始基础内容之前,假定您已经完成了ROS kinetic版本的安装, 如果没有请参考ROS kinetic安装说明. 1. 环境变量 在使用ROS ...

  4. Unable to handle 'index' format version '2', please update rosdistro的解决办法

    之前安装的ROS是Fuerte版本的,好久没有更新,不知不觉又出来了好几个新的版本,今天删除了Fuerte,计划安装Hydro版本的尝尝新,按照官网的安装流程,很快就可以把新版本安装上去了,但是在&q ...

  5. Linux 共享内存 详解

    一.什么是共享内存区 共享内存区是最快的可用IPC形式.它允许多个不相关的进程去访问同一部分逻辑内存.如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映射到 ...

  6. Linux多线程实践(9) --简单线程池的设计与实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  7. Android开发技巧——TextView加载HTML的图片及代码显示问题

    前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...

  8. 4.1、Libgdx的生命周期

    (原文:http://www.libgdx.cn/topic/32/4-1-libgdx%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F) 一个libgdx应 ...

  9. 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法

    (一) 问题描述 ubuntu开机只有桌面,没有菜单栏和任务栏,如下图: (二) 问题解决 刚学习ubuntu,总有些像我这样不折腾就不舒服的人,今天改了一下主题,图标什么的,重启开机后就发现!咦!我 ...

  10. Ext.Net 1.x_Ext.Net.GridPanel 事件

    1.行双击事件 首先设置选择方式为RowSelectionModel单行选中 [html] view plaincopy <SelectionModel> <ext:RowSelec ...