定义
An attribute is a piece of additional declarative information that is specified for a declaration。
认识,使用attributes
using System;
public class Program
{
[Obsolete("Don't use Old method, use New method", true)]
static void Old( ) { }
static void New( ) { }
public static void Main( )
{
Old( );
}
}
编译上面的上面的程序,我们会得到如下错误:
AnyClass.Old()' is obsolete: 'Don't use Old method, use New method'
创建2个自定义attributes
public class IsTestedAttribute : Attribute
{
public override string ToString()
{
return "Is Tested";
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class AuthorAttribute : Attribute
{
public AuthorAttribute(string name)
{
this.name = name;
this.version = 0;
}
public string Name
{
get
{
return name;
}
}
public int Version
{
get
{
return version;
}
set
{
version = value;
}
}
public override string ToString()
{
string value = "Author : " + Name;
if (version != 0)
{
value += " Version : " + Version.ToString();
}
return value;
}
private string name;
private int version;
}
创建自定义类,并使用Attributes
[Author("Joe Programmer")]
class Account
{
[IsTested]
public void AddOrder(Order orderToAdd)
{
orders.Add(orderToAdd);
}
private ArrayList orders = new ArrayList();
}
[Author("Jane Programmer", Version = 2), IsTested()]
class Order
{
// add stuff here ...
}
最后,在运行时查询Attributes
class MainClass
{
private static bool IsMemberTested(MemberInfo member)
{
foreach (object attribute in member.GetCustomAttributes(true))
{
if (attribute is IsTestedAttribute)
{
return true;
}
}
return false;
}
private static void DumpAttributes(MemberInfo member)
{
Console.WriteLine("Attributes for : " + member.Name);
foreach (object attribute in member.GetCustomAttributes(true))
{
Console.WriteLine(attribute);
}
}
public static void Main()
{
DumpAttributes(typeof(Account));
foreach (MethodInfo method in (typeof(Account)).GetMethods())
{
if (IsMemberTested(method))
{
Console.WriteLine("Member {0} is tested!", method.Name);
}
else
{
Console.WriteLine("Member {0} is NOT tested!", method.Name);
}
}
Console.WriteLine();
DumpAttributes(typeof(Order));
foreach (MethodInfo method in (typeof(Order)).GetMethods())
{
if (IsMemberTested(method))
{
Console.WriteLine("Member {0} is tested!", method.Name);
}
else
{
Console.WriteLine("Member {0} is NOT tested!", method.Name);
}
}
Console.WriteLine();
}
运行结果
Attributes for : Account
Author : Joe Programmer
Member AddOrder is tested!
Member ToString is NOT tested!
Member Equals is NOT tested!
Member GetHashCode is NOT tested!
Member GetType is NOT tested!
Attributes for : Order
Author : Jane Programmer Version : 2
Is Tested
Member ToString is NOT tested!
Member Equals is NOT tested!
Member GetHashCode is NOT tested!
Member GetType is NOT tested!