定制特性可以应用的目标元素可以为:程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)

定制特性以[,]形式展现,放在紧挨着的元素上,多个特性可以应用于同一元素,特性间以逗号隔开,以下表达规则有效:

[AttributeUsage][ Flags]、[AttributeUsage, Flags]、[Flags, AttibuteUsageAttribute]、[AttributeUsage(), FlagesAttribute()]

attibute实例,是在编译期进行初始化,而不是运行的时候。

定制特性类型,必须直接或者间接的继承自System.Attribute类,而且该类型必须有公有构造函数来创建其实例。

所有自定义的特性名称都应该有个Attribute后缀,这是习惯性约定。

定制特性也可以应用在其他定制特性上,这点也很好理解,因为定制特性本身也是一个类,遵守类的公有规则。例如很多时候我们的自定义定制特性会应用AttributeUsageAttribute特性,来控制如何应用新定义的特性。

[AttributeUsageAttribute(AttributeTarget.All),

[AttributeUsageAttribute(AttributeTarget.All),
AllowMultiple = true,
Inherited = true]
class MyNewAttribute: System.Attribute
{
//
}

定制特性不会影响应用元素的任何功能,只是约定了该元素具有的特质。

所有非抽象特性必须具有public访问限制。

定制特性常用于在运行期获得代码注释信息,以附加信息来优化调试。

定制特性可以应用在某些设计模式中,如工厂模式。

定制特性还常用于位标记,非托管函数标记、方法废弃标记等其他方面。

特性能干嘛
1)功能性信息:如[Serializable]加在类前表示该类可被串行化。
[Serializable]
public class HumanProperty

2)提示性信息:如[Obsolete]表示该方法已经过时,提醒程序员使用新的替代函数。
[Obsolete("Use another method : Average(), instead!", true)]
public virtual void CalcAverage(int speed)

3)限定性信息:如[Conditional("DEBUG")]表示下面的方法只有在调试模式下才有效。
[Conditional("DEBUG")]
public void UnitTest()

4)描述性信息:如[Description]对所指对象进行详细描述。
public enum CreditCardType
{
  [Description("Unknown")]
  Unknown,

  [Description("Corp Card")]
  CC
}

可以定义一个特性用来验证用户是否登录

    /// <summary>
/// 用户登陆的过滤器,没有登陆的用户将跳到/User/Login页面
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class LoginAuthorizeAttribute : ActionFilterAttribute//ActionFilterAttribute是MVC中定义的一个特性
{
//对ActionFilterAttribute特性中的方法进行重写
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
///ViewsHelper.userInfo
///ViewsHelper是一个静态类,用来存放一些全局的数据,登录数据,用户信息等
///userInfo是ViewsHelper中的用户登录数据
if (ViewsHelper.userInfo == null)
{
//发现没有用户登录信息设置重定向地址和参数
filterContext.Result = new RedirectResult(
string.Concat("/UserInfo/Login"
, "?returnUrl="
, filterContext.RequestContext
.HttpContext
.Server
.UrlEncode(filterContext.HttpContext.Request.Url.PathAndQuery)));
}
else
{
var model = LoginSessionHelper.GetLoginSession(ViewsHelper.userInfo.ID);
if (model != null)
{
if (model.SessionID != filterContext.HttpContext.Session.SessionID)
{
filterContext.HttpContext.Session.Clear();
filterContext.Result = new RedirectResult(
string.Concat("/UserInfo/Login"
, "?tag=1&time=" + model.LastTime.ToString("HH:mm:dd") + "&returnUrl="
, filterContext.RequestContext
.HttpContext
.Server
.UrlEncode(filterContext.HttpContext.Request.Url.PathAndQuery)));
}
}
}
base.OnActionExecuting(filterContext);
} }

可以对类或者属性等等,添加描述信息

    public enum AdvertisementType
{
[Description("视频")]
Video = , [Description("图片")]
Image =
}

然后就可以通过反射来获取到每个枚举中定义的Description("视频") 属性

C#中的特性基本理解的更多相关文章

  1. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

  2. c#中的特性

    c#中的特性 特性在我的理解就是在类或者方法或者参数上加上指定的标记,然后实现指定的效果. 和Java中的注解@Annotation类似. c#内置的特性之Obsolete [Obsolete(&qu ...

  3. C#中的 特性 详解(转载)

    本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...

  4. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  5. SQL SERVER 2005/2008 中关于架构的理解(一)

    SQL SERVER 2005/2008 中关于架构的理解(一) 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询, ...

  6. java 对象的this使用 java方法中参数传递特性 方法的递归

    一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this  --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...

  7. .net中的特性

    本文来之:http://hi.baidu.com/sanlng/item/afa31eed0a383e0e570f1d3e 在一般的应用中,特性(Attribute,以称为属性)好像被使用的不是很多. ...

  8. Performance Tuning guide 翻译 || Performance Tuning Guide 11G中新增特性

    CSDN 对格式支持比較弱.能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. Performance Tuning Guide  ...

  9. ECshop中的session机制理解

    ECshop中的session机制理解     在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...

随机推荐

  1. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

  2. BZOJ3145 : [Feyat cup 1.5]Str

    如果不存在模糊点,那么答案就是两个串的最长公共子串. 如果模糊点是某个串的开头或者结尾,那么可以暴力枚举另一个串中的某个前后缀更新答案. 否则,假设模糊点在第一个串里是$i$,在第二个串里是$j$,那 ...

  3. BZOJ4538 : [Hnoi2016]网络

    求出这棵树的dfs序,对于一条链$u-v$,假设$st[u]\leq st[v]$,那么一条链不经过点$x$当且仅当它满足下面任意一个条件: 1.$st[v]<st[x]$ 2.$st[u]&g ...

  4. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  5. NOI 题库 1792

    1792  迷宫 描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Exten ...

  6. BZOJ1391: [Ceoi2008]order

    Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Inpu ...

  7. passing ‘const ’ as ‘this’ argument of ‘’ discards qualifiers 错误处理

    示例程序: #include <iostream> #include <set> using   namespace std ; class   StudentT { publ ...

  8. Qt Load and Save PCL/PLY 加载和保存点云

    Qt可以跟VTK和PCL等其他库联合使用,十分强大,下面的代码展示了如何使用Qt联合PCL库来加载和保存PCL/PLY格式的点云: 通过按钮加载点云: void QMainWindow::on_pb_ ...

  9. mysql错误代码整理

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除 ...

  10. 使用ftp软件上传下载php文件时换行丢失bug

    正 文:   在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了, ...