本文主要通過一個實際的例子來解釋“代碼屬性”的概念
代碼屬性是與代碼一起在程式的運行過程中為代碼服務的,理解“代碼屬性”概念的關鍵在於認識到“代碼屬性”也是一種類,它是一種特殊的類,一種從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();
}
}
}
看看啟動並執行結果