使用attribute的例子

轉自百度知道的一個回答點擊打開鏈接,第一個專業回答是典型例子,作爲參考是不錯的,提問者採納的更好:


假設你的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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章