接上文.Net Attribute详解(上)-Attribute本质以及一个简单示例,这篇文章介绍一个非常实用的例子,相信你一定能够用到你正在开发的项目中。枚举类型被常常用到项目中,如果要使用枚举ToString方法直接输出字符串, 常常不是我们想要的输出,因为它是安装定义的名称输出字符串。比如你有一个性别枚举,有Man, Woman. 你在中文系统中,在创建用户的页面上,这个枚举代表的下拉框,当然不是显示Man和Woman的,而是要显示”男”和”女“。 下面就介绍如何使用Attribute非常方便的输出我们想要的字符串。

1, 使用System.ComponentModel.DescriptionAttribute

比如,下面这个枚举

enum Gender
{
Man,
Woman
};

在使用上DescriptionAttribute后,可以改造成这样

enum Gender
{
[Description(“男”)]
Man, [Description(“女”)]
Woman
};

好了,使用Attribute的三个步骤:

Attribute的定义, Attribute的使用(贴标签), Attribute的读取和使用(根据标签做不同处理)

第一步,我们使用了系统中的Attribute,贴标签已经做好了,接下来时对于Attribute的读取和使用了。

2, EnumHelper类

下面定义的EnumHelper类,使用扩展方法,为枚举提供了非常方便的方式输出Description. 比如,我们可以这样使用下面的方法,来得到对应项的字符串:

Gender.Man.GetDescription()

上面输出的就会我们想要的”男”, 而不是”Man”.

/// <summary>
/// Contains methods for working with <see cref="Enum"/>.
/// </summary>
public static class EnumHelper
{
/// <summary>
/// Gets the specified enum value's description.
/// </summary>
/// <param name="value">The enum value.</param>
/// <returns>The description or <c>null</c>
/// if enum value doesn't have <see cref="DescriptionAttribute"/>.</returns>
public static string GetDescription(this Enum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(
typeof(DescriptionAttribute),
false);
return attributes.Length >
? attributes[].Description
: null;
} /// <summary>
/// Gets the enum value by description.
/// </summary>
/// <typeparam name="EnumType">The enum type.</typeparam>
/// <param name="description">The description.</param>
/// <returns>The enum value.</returns>
public static EnumType GetValueByDescription<EnumType>(string description)
{
var type = typeof(EnumType);
if (!type.IsEnum)
throw new ArgumentException("This method is destinated for enum types only.");
foreach (var enumName in Enum.GetNames(type))
{
var enumValue = Enum.Parse(type, enumName);
if (description == ((Enum)enumValue).GetDescription())
return (EnumType)enumValue;
}
throw new ArgumentException("There is no value with this description among specified enum type values.");
}
}

3.  Attribute在MVC中的Razor view engine 中的使用

在Model上我们可以添加上DisplayAttribute, 比如

public class User
{
[Display(Name = "User Name)]
public string Name{get;set;}
}

这样在view中使用Html.DisplayFor(), 输出的就是User Name。
这里的使用和我们上面的EnumHelper的原理完全相同。

还有关于Model上的验证相关的Attribute, 比如MaxLength.

[MaxLength(, ErrorMessage = "The max length is 100")]
public string Name{get;set;}

把MaxLength加在Name上,它不仅能够作为MVC中的验证,而且会在Entity Framwork中,作为数据检查规则。因为这个属性披上了一个外衣,上面写着“我的最大长度是100”,如果有任何数据有效性检查的类,都会看到这个外衣,同时检查这个属性的长度是否符合要求。

总之,理解了什么是Attribute, 以及原理,对于理解.net中无处不在的,那些加载类上或者属性上的[]东东,一定能够更加容易。

.Net Attribute详解(下) - 使用Attribute武装枚举类型的更多相关文章

  1. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  2. .Net Attribute详解(一)

    .Net Attribute详解(一) 2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑 Attribute的直接翻译是属性,这和Property ...

  3. [js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)

    本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entr ...

  4. SSL/TLS协议详解(下)——TLS握手协议

    本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...

  5. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  6. 使用IDEA详解Spring中依赖注入的类型(上)

    使用IDEA详解Spring中依赖注入的类型(上) 在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件 ...

  7. C# 自定义特性(Attribute)详解

    什么是特性 特性的定义:公共语言运行时允许添加类似关键字的描述声明,叫做attribute,它对程序中的元素进行标注,如类型.字段.方法.和属性等.attribute和.NetFramework文件的 ...

  8. .Net Attribute详解(上)-Attribute本质以及一个简单示例

    Attribute的直接翻译是属性,这和Property容易产生混淆,所以一般翻译成特性加以区分.Attribute常常的表现形式就是[AttributeName], 随意地添加在class, met ...

  9. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

随机推荐

  1. C#的变迁史 - C# 2.0篇

    在此重申一下,本文仅代表个人观点,如有不妥之处,还请自己辨别. 第一代的值类型装箱与拆箱的效率极其低下,特别是在集合中的表现,所以第二代C#重点解决了装箱的问题,加入了泛型.1. 泛型 - 珍惜生命, ...

  2. C#的变迁史 - C# 1.0篇

    C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ...

  3. 介绍开源的.net通信框架NetworkComms框架 源码分析(十一)PacketBuilder

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  4. 炉石传说 C# 开发笔记 (法术篇)

    炉石的设计,最核心的内容是法术效果. 法术卡牌,无疑是法术的集中体现,但是,法术效果除了在法术卡牌之外,也不除不在. 随从的战吼,亡语,奥秘的揭示等等都是法术效果的体现. 法术卡牌在炉石里面有很多种( ...

  5. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  6. iTextSharp快速使用指南

    前言 最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可. 所以这篇文章就是告诉大家如 ...

  7. PHP替代正则匹配的高效函数

    strpos() - 查找字符串首次出现的位置 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写). strripos() 函数查找字符串在另一字符串中最后一次出现的位置 ...

  8. 【Effective Java】11、同步访问共享的可变数据

    这段时间看的部分感觉没啥需要记录下来的,个人也没什么想法,不过以后还是要多记,多写 package cn.xf.cp.ch02.item66; import java.util.concurrent. ...

  9. ubuntu 下安装memcache 以及php扩展

    1,下载软件   下载   memcached   http://memcached.org/downloads   下载libevent http://libevent.org/     2,安装  ...

  10. ubuntu 安装配置ssh

    1.安装ssh-server sudo apt-get install openssh-server 2.设置管理员密码访问 sudo vim /etc/ssh/sshd_config 将“Permi ...