Attribute的一个列子

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