轉自百度知道的一個回答點擊打開鏈接,第一個專業回答是典型例子,作爲參考是不錯的,提問者採納的更好:
假設你的F()方法是定義在下面這個類裏面: public class MyClass { [IStudent(Name = "abc", Age = 20)] public void F() { } } 那麼可以這麼去取值: Type type = typeof(MyClass); MethodInfo methodInfo = type.GetMethod("F"); if (methodInfo.IsDefined(typeof(IStudentAttribute), false)) { object[] attributes = methodInfo.GetCustomAttributes(typeof(IStudentAttribute), false); IStudentAttribute studentAttr = (IStudentAttribute)attributes[0]; Console.WriteLine(studentAttr.Name + studentAttr.Age); } 實際上,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);