Attribute的一个列子
生活随笔
收集整理的這篇文章主要介紹了
Attribute的一个列子
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
其實(shí)在博客中也寫(xiě)過(guò)這個(gè)東西,也介紹過(guò)它的原理,原理很簡(jiǎn)單,就是在運(yùn)行的時(shí)候通過(guò)反射攔截獲取一些信息,但是我在寫(xiě)程序的時(shí)候幾乎沒(méi)用過(guò),可能是自己接觸的還不夠多,也許是因?yàn)樽约航佑|的功能不算復(fù)雜往往幾句代碼就可以搞定,用這個(gè)實(shí)在沒(méi)有必要,跟朋友討論,這個(gè)在框架的時(shí)候用的多
,看來(lái)自己還真沒(méi)到這個(gè)說(shuō)平。這個(gè)詞一般翻譯為特性,以區(qū)別property,雖然從英文翻譯過(guò)來(lái)的意思和后者是一樣的,但是在這里還是區(qū)分下。實(shí)際上,Attribute可以有很多用處,比如說(shuō),你可以在某個(gè)方法上做標(biāo)記看有沒(méi)有權(quán)限調(diào)用,或者在某個(gè)屬性上標(biāo)記,看要如何校驗(yàn)。例如(實(shí)在習(xí)慣用var關(guān)鍵字了,下面的代碼都用var了,還有Linq): 假設(shè)我們有這么一個(gè)標(biāo)記來(lái)說(shuō)明操作的權(quán)限:/// <summary>/// 聲明權(quán)限的標(biāo)記/// </summary> [AttributeUsage(AttributeTargets.Method)]public class PermissonAttribute : Attribute{public string Role { get; set; }public PermissonAttribute(string role){this.Role = role;}public PermissonAttribute(){}}有一個(gè)操作類應(yīng)用了該標(biāo)記:/// <summary>/// 文件操作類/// </summary>public class FileOperations{/// <summary>/// 任何人都可以調(diào)用Read/// </summary>[Permisson("Anyone")]public void Read(){}/// <summary>/// 只有文件所有者才能Write/// </summary>[Permisson("Owner")]public void Write(){}} 然后我們寫(xiě)一個(gè)工具類來(lái)檢查操作權(quán)限/// <summary>/// 調(diào)用操作的工具類/// </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)){// 讀取出所有權(quán)限相關(guān)的標(biāo)記var permissons = methodInfo.GetCustomAttributes(typeof(PermissonAttribute), false).OfType<PermissonAttribute>();// 如果其中有滿足的權(quán)限if (permissons.Any(p => p.Role == role)){methodInfo.Invoke(target, parameters);}else{throw new Exception(string.Format("角色{0}沒(méi)有訪問(wèn)操作{1}的權(quán)限!", role, operationName));}}}}最后,在使用的時(shí)候: var role = "Anyone"; var opertion = new FileOperations(); // 可以正常調(diào)用Read OperationInvoker.Invoke(operation, "Read", null); // 但是不能調(diào)用Write OperationInvoker.Invoke(operation, "Write", null);
,看來(lái)自己還真沒(méi)到這個(gè)說(shuō)平。這個(gè)詞一般翻譯為特性,以區(qū)別property,雖然從英文翻譯過(guò)來(lái)的意思和后者是一樣的,但是在這里還是區(qū)分下。實(shí)際上,Attribute可以有很多用處,比如說(shuō),你可以在某個(gè)方法上做標(biāo)記看有沒(méi)有權(quán)限調(diào)用,或者在某個(gè)屬性上標(biāo)記,看要如何校驗(yàn)。例如(實(shí)在習(xí)慣用var關(guān)鍵字了,下面的代碼都用var了,還有Linq): 假設(shè)我們有這么一個(gè)標(biāo)記來(lái)說(shuō)明操作的權(quán)限:/// <summary>/// 聲明權(quán)限的標(biāo)記/// </summary> [AttributeUsage(AttributeTargets.Method)]public class PermissonAttribute : Attribute{public string Role { get; set; }public PermissonAttribute(string role){this.Role = role;}public PermissonAttribute(){}}有一個(gè)操作類應(yīng)用了該標(biāo)記:/// <summary>/// 文件操作類/// </summary>public class FileOperations{/// <summary>/// 任何人都可以調(diào)用Read/// </summary>[Permisson("Anyone")]public void Read(){}/// <summary>/// 只有文件所有者才能Write/// </summary>[Permisson("Owner")]public void Write(){}} 然后我們寫(xiě)一個(gè)工具類來(lái)檢查操作權(quán)限/// <summary>/// 調(diào)用操作的工具類/// </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)){// 讀取出所有權(quán)限相關(guān)的標(biāo)記var permissons = methodInfo.GetCustomAttributes(typeof(PermissonAttribute), false).OfType<PermissonAttribute>();// 如果其中有滿足的權(quán)限if (permissons.Any(p => p.Role == role)){methodInfo.Invoke(target, parameters);}else{throw new Exception(string.Format("角色{0}沒(méi)有訪問(wèn)操作{1}的權(quán)限!", role, operationName));}}}}最后,在使用的時(shí)候: var role = "Anyone"; var opertion = new FileOperations(); // 可以正常調(diào)用Read OperationInvoker.Invoke(operation, "Read", null); // 但是不能調(diào)用Write OperationInvoker.Invoke(operation, "Write", null);
?
總結(jié)
以上是生活随笔為你收集整理的Attribute的一个列子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: getOwnPropertyNames(
- 下一篇: 实现单链表逆置