Attribute的一个列子
生活随笔
收集整理的這篇文章主要介紹了
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);
,看來自己還真沒到這個說平。這個詞一般翻譯為特性,以區別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的一个列子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getOwnPropertyNames(
- 下一篇: 实现单链表逆置