C#進階編程之“代碼屬性”

來源:互聯網
上載者:User

本文主要通過一個實際的例子來解釋“代碼屬性”的概念

代碼屬性是與代碼一起在程式的運行過程中為代碼服務的,理解“代碼屬性”概念的關鍵在於認識到“代碼屬性”也是一種類,它是一種特殊的類,一種從System.Attribute繼承出來的類。

下面的代碼主要實現的功能是:在代碼運行異常的時候,根據該段代碼的“代碼屬性”給出這段代碼的作者以及這名作者的電子信箱。

下面給出一個自訂的“代碼屬性”的類:

 

using System;

namespace CodeProperty
{
    /// <summary>
    /// CustomAttribute 的摘要說明。
    /// </summary>
    [AttributeUsage(AttributeTargets.All)]
    public class CustomAttribute:System.Attribute
    {
        public CustomAttribute(string name,string email)
        {
            this.CodeAuthorName=name;
            this.CodeAuthorEmail=email;
        }
        private string CodeAuthorName=string.Empty;
        private string CodeAuthorEmail=string.Empty;
        public string AuthorName
        {
            get
            {
                return this.CodeAuthorName;
            }
            set
            {
                this.CodeAuthorName=value;
            }
        }
        public string AuthorEmail
        {
            get
            {
                return this.CodeAuthorEmail;
            }
            set
            {
                this.CodeAuthorEmail=value;
            }
        }

    }
}

 

為了使用這個自訂的“代碼屬性”的類,我們寫了一個有問題的代碼:

 

using System;
using System.Reflection;

namespace CodeProperty
{
    /// <summary>
    /// ClassWithError 的摘要說明。
    /// </summary>
    public class ClassWithError
    {
        public ClassWithError()
        {
            //
            // TODO: 在此處添加建構函式邏輯
            //
            
        }
        [Custom("testname", "testname@21cn.com")]
        public void DoSomething()
        {
            try
            {
                int x=20;
                int y=4;
                int z=y-4;
                int result=x/z;
            }
            catch
            {
                Console.WriteLine("代碼有一些錯誤發生");
                Console.WriteLine("int x=20;");
                Console.WriteLine("int y=4;");
                Console.WriteLine("int z=y-4;");
                Console.WriteLine("int result=x/z;");
                CustomAttribute ca=CustomAttributeTool.GetAttributeData(MethodBase.GetCurrentMethod());
                Console.WriteLine("本段代碼由{0}編寫,他/她的電子信箱是{1}",ca.AuthorName,ca.AuthorEmail);                
            }
        }

    }
}

 

注意在裡面有一個CustomAttributeTool,這個類的目的是得到CustomAttribute類的作者屬性與作者的電子信箱

代碼如下:

 

using System;
using System.Reflection;
namespace CodeProperty
{
    /// <summary>
    /// CustomAttributeTool 的摘要說明。
    /// </summary>
    public class CustomAttributeTool
    {
        public CustomAttributeTool()
        {
            //
            // TODO: 在此處添加建構函式邏輯
            //
        }
        public static CustomAttribute GetAttributeData(MethodBase method)
        {
            object[] attributes=method.GetCustomAttributes(typeof(CustomAttribute),true);
            return (CustomAttribute)attributes[0];
        }
    }
}

 

好了,最後我們來寫一個帶main的類來調用它們就可以了

帶main的類的代碼如下:

 

using System;

namespace CodeProperty
{
    /// <summary>
    /// Class1 的摘要說明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 應用程式的主進入點。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此處添加代碼以啟動應用程式
            //
            ClassWithError cwe=new ClassWithError();
            cwe.DoSomething();
            Console.ReadLine();
        }
    }
}

 

看看啟動並執行結果

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.