一  Attribute原理:

Attribute注解,是附加上方法、属性、类等上面的标签,
可以通过方法的GetCustomAttribute获得粘贴的这个Attribute对象
通过反射调用到粘贴到属性、方法、类等等的对象
任务:改造ORM
ORM约定:类得名字与表的名字一样,主键必须是Id,
改造一下ORM(类名还可以和表名不一样,Id可以与主键不一样)

//在sayHello方法的描述信息MethodInfo上粘了一个RupengAttribute对象
//注解的值必须是常量,不能是动态算出来的 [RupengAttribute(Name=DateTime.Now.ToString())]
//[RupengAttribute(Name="rupengwnag")]
//一般特性Attribute的类名都以Attribute结尾,这样用的时候就不用谢"Attribute"了

二  Attribute步骤:

1 Attribute本身类
2 标记了Attribute的类
3 通过找到这个类的Attribute标记,从而先去执行上面的Attribute类

三 Attribute示例:

//testAttribute.csProj

namespace testAttribute
{
class Program
{
static void Main(string[] args)
{
Type type = typeof(Person);
//1 获得SayHello()上的Attribute注解对象
object[] objs = type.GetMethod("SayHello").GetCustomAttributes(typeof(AlibabaAttribute), true);
foreach(object obj in objs)
{
AlibabaAttribute ali = obj as AlibabaAttribute;
Console.WriteLine(ali.Name);
} //2 在类中的方法中找到Obsolete注解对象
MethodInfo[] methods = type.GetMethods();
foreach(MethodInfo method in methods)
{
Object[] obsols = method.GetCustomAttributes(typeof(ObsoleteAttribute),true);
if (obsols.Length>)
{
ObsoleteAttribute obsol = obsols[] as ObsoleteAttribute;
Console.WriteLine("不能执行该方法:" + obsol.Message);
}
} //3 获得Love()的Attribute注解对象
object[] objtens = type.GetMethod("Love").GetCustomAttributes(typeof(TengxunAttribute), true);
foreach (object obj in objtens)
{
TengxunAttribute ten = obj as TengxunAttribute;
Console.WriteLine(ten.Name);
} Console.ReadKey();
}
} class Person
{
[Alibaba(Name="阿里人是幸福的")]
public void SayHello()
{
} [Obsolete("这个方法已过时,禁止访问")]
public void F1()
{
} [Tengxun(Name = "腾讯是我的最爱")]
public void Love()
{
}
} //
[AttributeUsage(AttributeTargets.Method)]
class AlibabaAttribute : Attribute
{
public AlibabaAttribute() { }
public AlibabaAttribute(string name)
{
this.Name = name;
}
public string Name { get; set; }
} //
class TengxunAttribute : Attribute
{
public string Name { get; set; }
}
}

四  Attribute应用:

当执行某个action方法时,先获得Attribute对象,用于检查权限

//PermissionActionAttribute.cs

    /// <summary>
/// 权限动作的 Attribute注解
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class PermissionActionAttribute:Attribute
{
public string Name { get; set; }
public PermissionActionAttribute(string name)
{
this.Name = name;
}
}

//BaseController.cs

public class BaseController : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//需要约定方法:public void list(HttpContext context) //方法名和action一致
#region 检查用户是否登录
LoginHelper.CheckHasLogin(context);
#endregion
string action = context.Request["action"];
if(action==null)
{
throw new Exception("未找到action:"+action);
}
Type type = this.GetType(); //this是被new的对象,即子类CategoryController等
//try
//{
MethodInfo method = type.GetMethod(action);
#region /获得该action的 Attribute注解对象
//获得action该方法的 Attribute注解对象(注解对象的Name属性就是权限的名称,用于判断权限)
object[] objAttrs = method.GetCustomAttributes(typeof(PermissionActionAttribute), true);
if (objAttrs.Length > )
{
PermissionActionAttribute paa = objAttrs[] as PermissionActionAttribute;
AdminHelper.CheckHasPower(context, paa.Name);
}
#endregion
method.Invoke(this, new object[] { context }); //调用this对象的method方法 (参数列表是object[],其中一个参数是context)
//}
//catch(Exception ex) //如果找不到这个action方法,就说明这个action是错误的/不存在的
//{
// throw new Exception("未知的action:"+action);
//}
} public bool IsReusable
{
get
{
return true;
}
}
}

//CourseController.cs

            [PermissionAction("新增课程")]
public void addnew(HttpContext context)
{
#region 新增展示
string categoryidStr = context.Request["categoryid"];
int categoryid = VolidHelper.CheckStrToInt(categoryidStr);
TD_COURSE course = new TD_COURSE();
course.VIDEOCATEGORYID = categoryid;
RazorHelper.RazorParse(context, "~/Course/CourseAlter.cshtml", new { action = "addnew", course = course });
#endregion
}

Attribute注解(用于判断权限)的更多相关文章

  1. Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存

    一  基于注解方式的权限控制 首先, 在spring配置文件applicationContext.xml中配置自动代理和切面 <!-- 8配置自动代理 -->    <bean cl ...

  2. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...

  3. 「踩坑记」Android API 判断权限申请结果的闪退问题

    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...

  4. Assertor用于判断参数和抛出异常

    代码 /// <summary> 断言器,用于判断和抛出异常 /// </summary> static class Assertor { /// <summary> ...

  5. stop() 是用于停止动画 :animated 用于判断动画是否在进行中

    stop() 是用于停止动画 if($("element").is(":animated"))  用于判断动画是否在进行中

  6. JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内

    /* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...

  7. Attribute注解

    class Program { static void Main(string[] args) { //Attribute注解,Attribute是附加到方法.属性.类等上面的特殊的标签,在类Type ...

  8. obj.getClass() == Person.class 用于判断类型

    obj.getClass() == Person.class  用于判断类型

  9. 一个diff工具,用于判断两个目录下所有的改动(比较新旧版本文件夹)

    需求: 编写一个diff工具,用于判断两个目录下所有的改动 详细介绍: 有A和B两个目录,目录所在位置及层级均不确定 需要以B为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...

随机推荐

  1. HTML如何禁止文本框输入

    禁止文本框输入有以下两种方法: 1,设置input为只读状态,代码如下: <input readonly="readonly" value="test1" ...

  2. debian下使用dynamic printk分析usb网卡驱动

    在<debian下使用dynamic printk分析usb转串口驱动执行流程>中使用了usb转串口,当前例子使用usb网卡分析驱动(dm9601芯片). 仍然需要使能dynamic pr ...

  3. explicit c++

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...

  4. 1.linux源码安装nginx

    从官网下载nginx.tar.gz源码包 拷贝至Linux系统下进行解压 tar -zxvf nginx.tar.gz 进入解压后的目录,需要./configure,此步骤会报多个错,比如没有安装gc ...

  5. eclipse设置高亮显示的颜色

    设置高亮显示的颜色:Window-->preferences-->General-->Editors-->Text Editors-->Annotations--> ...

  6. 什么是OOM?如何解决OOM问题!

    1.什么是OOM? 程序申请内存过大,虚拟机无法满足我们,然后自杀了.这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候.通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认 ...

  7. mysql中两表更新时产生的奇葩问题,产生死锁!

    如下一个两表更新语句 UPDATE hzxm201610 a,xmhzylb1201610 b SET a.gk07_1_6=b.gk04_11,a.gk07_2_6=b.f06_1,a.gk07_3 ...

  8. YARN作业提交流程剖析

    YARN(MapReduce2) Yet Another Resource Negotiator / YARN Application Resource Negotiator对于节点数超出4000的大 ...

  9. Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。

    实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...

  10. 爬虫之解析库-----re、beautifulsoup、pyquery

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...