Attribute的一个列子

简介: 其实在博客中也写过这个东西,也介绍过它的原理,原理很简单,就是在运行的时候通过反射拦截获取一些信息,但是我在写程序的时候几乎没用过,可能是自己接触的还不够多,也许是因为自己接触的功能不算复杂往往几句代码就可以搞定,用这个实在没有必要,跟朋友讨论,这个在框架的时候用的多,看来自己还真没到这个说平。
其实在博客中也写过这个东西,也介绍过它的原理,原理很简单,就是在运行的时候通过反射拦截获取一些信息,但是我在写程序的时候几乎没用过,可能是自己接触的还不够多,也许是因为自己接触的功能不算复杂往往几句代码就可以搞定,用这个实在没有必要,跟朋友讨论,这个在框架的时候用的多
,看来自己还真没到这个说平。这个词一般翻译为特性,以区别property,虽然从英文翻译过来的意思和后者是一样的,但是在这里还是区分下。实际上,Attribute可以有很多用处,比如说,你可以在某个方法上做标记看有没有权限调用,或者在某个属性上标记,看要如何校验。例如(实在习惯用var关键字了,下面的代码都用var了,还有Linq): 假设我们有这么一个标记来说明操作的权限:
/// <summary> /// 声明权限的标记 /// </summary> [AttributeUsage(AttributeTargets.Method)] public class PermissonAttribute : Attribute { public string Role { get; set; } public PermissonAttribute(string role) { this.Role = role; } public PermissonAttribute() { } } 有一个操作类应用了该标记: /// <summary> /// 文件操作类 /// </summary> public class FileOperations { /// <summary> /// 任何人都可以调用Read /// </summary> [Permisson("Anyone")] public void Read() { } /// <summary> /// 只有文件所有者才能Write /// </summary> [Permisson("Owner")] public void Write() { } } 然后我们写一个工具类来检查操作权限 /// <summary> /// 调用操作的工具类 /// </summary> public static class OperationInvoker { public static void Invoke(object target, string role, string operationName, object[] parameters) { var targetType = target.GetType(); var methodInfo = targetType.GetMethod(operationName); if (methodInfo.IsDefined(typeof(PermissonAttribute), false)) { // 读取出所有权限相关的标记 var permissons = methodInfo .GetCustomAttributes(typeof(PermissonAttribute), false) .OfType<PermissonAttribute>(); // 如果其中有满足的权限 if (permissons.Any(p => p.Role == role)) { methodInfo.Invoke(target, parameters); } else { throw new Exception(string.Format("角色{0}没有访问操作{1}的权限!", role, operationName)); } } } } 最后,在使用的时候: var role = "Anyone"; var opertion = new FileOperations(); // 可以正常调用Read OperationInvoker.Invoke(operation, "Read", null); // 但是不能调用Write OperationInvoker.Invoke(operation, "Write", null);

 

相关文章
|
9月前
解决cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder‘ 的声明的问题~
解决cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder‘ 的声明的问题~
123 0
|
Android开发
eclipse文档注释设置、文件(Files)注释标签、类型(Types)注释标签(类的注释)、字段(Fields)注释标签、构造函数(Constructor)标签
设置注释模板的入口Window->Preference->Java->CodeStyle->CodeTemplate然后展开Comments节点就是所有需设置注释的元素。本文将每一个元素逐一给大家介绍一下。方法(Methods)标签、覆盖方法(Overriding Methods)标签、代理方法(Delegate Methods)标签、getter方法标签、setter方法标签.........
114 1
eclipse文档注释设置、文件(Files)注释标签、类型(Types)注释标签(类的注释)、字段(Fields)注释标签、构造函数(Constructor)标签
|
Java 容器 Spring
请举例解释@Required注解?
请举例解释@Required注解?
请举例解释@Required注解?
两种方法动态获得ABAP类的class attribute的值
两种方法动态获得ABAP类的class attribute的值
196 0
|
Linux C语言
利用__attribute__((section()))构建初始化函数表【转】
转自: https://mp.weixin.qq.com/s?__biz=MzAwMDUwNDgxOA==&mid=2652663356&idx=1&sn=779762953029c0e0946c22ef2bb0b754&chksm=810f28a1b678a1b747520ba3ee47c9e...
1686 0
零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异
原文:零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异 因为先前写到自制Button时需特别注意Tem...
1272 0
【基础】Attribute的妙用
如果您觉得文章对您有帮助,可以【打赏】博主或点击文章右下角【推荐】一下。您的鼓励是博主坚持原创和持续写作的最大动力!
706 0