C#高级编程之“代码属性”
本文主要通过一个实际的例子来解释“代码属性”的概念
代码属性是与代码一起在程序的运行过程中为代码服务的,理解“代码属性”概念的关键在于认识到“代码属性”也是一种类,它是一种特殊的类,一种从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;
}
}
}
}
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);
}
}
}
}
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];
}
}
}
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();
}
}
}
namespace CodeProperty
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
ClassWithError cwe=new ClassWithError();
cwe.DoSomething();
Console.ReadLine();
}
}
}
看看运行的结果