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机制不需 ...
随机推荐
- Linux 启动项介绍
1. init进程 非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1.init读它的配置文件/etc/inittab,决定需要启动的运行级别(Runlevel,分别由0到6的整数表示) ...
- React.js 常用技术要点
最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...
- 21045308刘昊阳 《Java程序设计》第十周学习总结
21045308刘昊阳 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴:程序员所作的事情 ...
- 洛谷 P1449 后缀表达式 Label:表达式计算系列
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...
- [Leetcode] Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Android -- ListView(SimpleAdapter) 自定义适配器
aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...
- win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)
http://blog.sina.com.cn/s/blog_9323b3a50101qrxm.html [解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始&qu ...
- OO与设计模式的原则、目标
OO与设计模式的原则.目标(转) 前两天,和一朋友聊到OO设计原则时,对设计模式有了更深的了解,在这里总结一下,与大家分享.OO(Object–Oriented )面向对象 OO方法(Object ...
- MVVM Command Binding: InvokeCommandAction v.s. EventToCommand
This gives you the ability to create a trigger on an event and bind it to an ICommand on the view mo ...
- jquery插件之文字无缝向上滚动
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的无缝向上滚动特效,当鼠标移动到文字上时,向上滚动会停止, ...