前言: 在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. Android用AlarmManager实现后台任务-android学习之旅(63)

    因为Timer不能唤醒cpu,所以会在省电的原因下失效,所以需要唤醒cpu在后台稳定化的执行任务,AlarmManager能够唤醒cpu 这个例子讲解了如何通过Service来在后他每一个小时执行.特 ...

  2. 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出

    分布式系统中的RPC请求经常出现乱序的情况.  写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:  1 ...

  3. 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider

    1.  编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...

  4. unity描边效果

    这里总结了几种在unity实现描边效果的方法,首先准备一个模型导入在unity中,使用默认shader,上传一张原始图,以便后面实现功能效果的对比 一.边缘光,这里参照官方的一个SurfaceShad ...

  5. App热补丁动态修复技术介绍

    安卓App热补丁动态修复技术介绍 来自qq空间团队:微信号qzonemobiledev QQ空间终端开发团队 1.背景 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就 ...

  6. Android 自定义标题栏

    开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标题栏传递数据. 本文要点: 自定义标题填充不完整 自定义标题栏返回按钮的点击事件 一.代码 这里先介绍一下流程 ...

  7. Android中的Message机制

    对于Android的Message机制主要涉及到三个主要的类,分别是Handler.Message.Looper:首先对每个类做一个简单介绍:然后再介绍所谓的Android的Message机制是如何实 ...

  8. MTK6577+Android之Camera驱动

    MTK6577+Android之Camera驱动 <MTK安卓平台的Camera效果在线调试> 1.     Camera拍照相关概念 1.1  ISP isp--(Image Signa ...

  9. linux上 java 使用 javasqlite

    linux上 java 使用 javasqlite http://www.ch-werner.de/javasqlite/ 1) 下载: http://www.ch-werner.de/javasql ...

  10. 【Qt编程】基于QWT的曲线绘制及图例显示操作

    在<QWT在QtCreator中的安装与使用>一文中,我们完成了QWT的安装,这篇文章我们讲讲基础曲线的绘制功能. 首先,我们新建一个Qt应用程序,然后一路默认即可.这时,你会发现总共有: ...