其实在博客中也写过这个东西,也介绍过它的原理,原理很简单,就是在运行的时候通过反射拦截获取一些信息,但是我在写程序的时候几乎没用过,可能是自己接触的还不够多,也许是因为自己接触的功能不算复杂往往几句代码就可以搞定,用这个实在没有必要,跟朋友讨论,这个在框架的时候用的多,看来自己还真没到这个说平。这个词一般翻译为特性,以区别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);

Attribute的一个列子相关推荐

  1. 关于Java多态的认识和一个列子

    文章转自 http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html, 感谢原作者 以及这里http://www.importnew. ...

  2. restlet_JAX-RS 的一个列子

    最近看了一个同事些的项目  用到了JAX-RS 这个来做实现数据接口.看了下不是很懂  特意搜了些列子学学 我的列子也是从网上下载的  代码简介 完整 可直接运行真的蛮好的. http://downl ...

  3. 一个列子演示java中软引用的回收时机

    示例代码如下: import java.lang.ref.SoftReference;/*** 软引用比弱引用强,如果一个对象只有软引用,那么当堆空间不足时候,才会被回收* 该类用于演示软引用的这一性 ...

  4. 一个列子让你弄懂SpringBoot实现后台框架的搭建

    首先项目搭建 首先项目基于idea来写的,下面演示项目搭建d     首先项目搭建 记住Application文件一定要在根目录底下不然程序会运行不起来的 然后开始新建包. constant :常量包 ...

  5. 一个列子看懂 隐藏(hide)

    前提: 子类和父类之间 一个类的属性.静态方法或者内部类可以分别隐藏(hide)在其超类中可以访问到的具有相同名字(对方法而言就是相同的签名)的所有属性.静态方法或者内部类.上述成员被隐藏后,将组织其 ...

  6. 覆盖与隐藏的区别 (一个列子)

    例子: class Student1{  int math = 70;  static int computer = 80;  int english = 65;  public Student1() ...

  7. 一个列子演示java中弱引用的回收时机

    示例代码如下 import java.lang.ref.WeakReference;/*** * 弱引用比软引用还要弱,在系统GC时候,只要发现弱引用,不管系统堆空间使用情况如何,都会将对象回收* 该 ...

  8. Attribute在.net编程中的应用

    作者:niwalker       出处:csdn SqlCommandGenerator类的设计 SqlCommandGEnerator类的设计思路就是通过反射得到方法的参数,使用被SqlComma ...

  9. Python中怎么判定一个List里面的元素是不是全部一样

    假设我们有一个List,怎么判断这个list里面的元素是不是全部都一样,我们可以用到set() 集合这个元素来操作 看一个列子 In [1]: l=[1,1,1,1]In [2]: len(set(l ...

最新文章

  1. 都优秀!两位硕士都发一作Nature,之后选择却截然不同!
  2. sklearn.preprocessing下的数据标准化(scale、MinMaxScaler)
  3. 如何让低版本IE浏览器支持HTML5和CSS3
  4. RecyclerView android:layout_width=match_parent无效
  5. Xcode7 真机免证书调试Cocos2D游戏
  6. 计算机网络作业答案吴,中国大学《2020春季课程-计算机网络应用吴迪》答案全部2020高校邦《羽毛球》作业题库答案...
  7. 利用selenium webdriver点击alert提示框
  8. MIP 脚本域名地址变更公告
  9. Android系统(274)---如何预置APK
  10. mysql 触发器执行失败_mysql-Mysql数据库触发器执行不成功
  11. 批量获取/打开链接 - 实践
  12. 红外图像和热成像图像
  13. 【C语言实现】goto语句实现简易关机程序
  14. hdu5745 La Vie en rose【dp+bitset优化】
  15. python模拟登录163邮箱_python selenium模拟登陆163邮箱。
  16. 解决无法解析服务器DNS地址
  17. Unity中的GUI编程
  18. CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig
  19. C语言进阶——地址和指针
  20. 选举投票制作制作一个投票链接制作步骤在线制作投票

热门文章

  1. Java基础巩固——反射
  2. 远程管理Hyper-V Server 虚拟机
  3. Dev的关于XtraGrid的使用2
  4. 【系统架构师修炼之道】(13):操作系统基础知识——进程基础知识
  5. zendStudio|Eclipse 相关收藏
  6. Epoll在LT和ET模式下的读写方式
  7. SQL SERVER DBCC 命令集整理
  8. 图像处理之一阶微分应用
  9. C# PictureBox加载图片并显示进度条
  10. STL之七:STL各种容器的使用时机详解