C#中的特性基本理解
定制特性可以应用的目标元素可以为:程序集(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#中的特性基本理解的更多相关文章
- C++中 类的构造函数理解(一)
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...
- c#中的特性
c#中的特性 特性在我的理解就是在类或者方法或者参数上加上指定的标记,然后实现指定的效果. 和Java中的注解@Annotation类似. c#内置的特性之Obsolete [Obsolete(&qu ...
- C#中的 特性 详解(转载)
本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...
- SQL SERVER 2005/2008 中关于架构的理解(二)
本文上接SQL SERVER 2005/2008 中关于架构的理解(一) 架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...
- SQL SERVER 2005/2008 中关于架构的理解(一)
SQL SERVER 2005/2008 中关于架构的理解(一) 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询, ...
- java 对象的this使用 java方法中参数传递特性 方法的递归
一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...
- .net中的特性
本文来之:http://hi.baidu.com/sanlng/item/afa31eed0a383e0e570f1d3e 在一般的应用中,特性(Attribute,以称为属性)好像被使用的不是很多. ...
- Performance Tuning guide 翻译 || Performance Tuning Guide 11G中新增特性
CSDN 对格式支持比較弱.能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. Performance Tuning Guide ...
- ECshop中的session机制理解
ECshop中的session机制理解 在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...
随机推荐
- HDU4067 Random Maze(最小费用最大流)
题目大概说,给一张图,删除其中一些单向边,使起点s出度比入度多1,终点t入度比出度多1,其他点出度等于入度.其中删除边的费用是bi,保留边的费用是ai,问完成要求最小的费用是多少. 一开始我想到和混合 ...
- Repeater 双向排序
做项目的时候,DataGrid ,DataList,Repeater 三个控件都是很优秀的数据显示控件,DataGrid的方便,简单易用,功能强大,但对性能会有所影响,在loading页面的时候大 ...
- Hadoop中客户端和服务器端的方法调用过程
1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...
- UVa 10870 & 矩阵快速幂
题意: 求一个递推式(不好怎么概括..)的函数的值. 即 f(n)=a1f(n-1)+a2f(n-2)+...+adf(n-d); SOL: 根据矩阵乘法的定义我们可以很容易地构造出矩阵,每次乘法即可 ...
- 【HDU】1536 S-Nim
http://acm.hdu.edu.cn/showproblem.php?pid=1536 题意:同nim...多堆多询问...单堆n<=10000,每次取的是给定集合的数= = #inclu ...
- 纪念逝去的岁月——C/C++快速排序
快速排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...
- .net的五层架构
原文章地址是http://www.360doc.com/content/11/1210/21/19147_171335782.shtml 我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经 ...
- UE编辑器FTP无法连接
解决办法:http://wenwen.sogou.com/z/q197743020.htm 无法从ue连接到主机,一直就是这样的状态 1. ftp帐户密码都没有问题: 2. 后台主机也没有问题: 3. ...
- TestStand与LabVIEW UI 交互
交互起因 客户觉得TestStand界面复杂,希望一个简单的界面即可进行序列执行,采用LabVIEW调用TestStand引擎可实现快速设计,将TestStand拆解到LabVIEW.然而,这样做需要 ...
- POJ 1195 二维树状数组
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18489 Accepted: 8558 De ...