除了直接使用.NET中内建的所有特性之外,我们也可以建立自己的特性来实现业务逻辑。在上面反射工厂的实现中就使用到了自定义特性。具体来说,定义一个特性的本质就是定义一个继承自System.Attribute类的类型,这样的类型就被编译器认为是一个特性类型。.
下面我们看看如何自顶一个特性并使用该特性:
① 定义一个继承自System.Attribute的类型MyCustomAttribute
/// <summary>
/// 一个自定义特性MyCustomAttribute
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class MyCustomAttribute : Attribute
{
private string className;
public MyCustomAttribute(string className)
{
this.className = className;
}
// 一个只读属性ClassName
public string ClassName
{
get
{
return className;
}
}
}
一个继承自System.Attribute的类型,就是一个自定义特性,并且可以将其添加到适合的元素之上。特性将会被写入到元数据之中,所以特性的使用基本都是基于反射机制。
② 在入口方法中使用MyCustomAttribute
[MyCustom("UseMyCustomAttribute")]
public class UseMyCustomAttribute
{
public static void Main(string[] args)
{
Type t = typeof(UseMyCustomAttribute);
// 通过GetCustomAttributes方法得到自定义特性
object[] attrs = t.GetCustomAttributes(false);
MyCustomAttribute att = attrs[0] as MyCustomAttribute;
Console.WriteLine(att.ClassName);
Console.ReadKey();
}
}
关于自定义特性,有几点需要注意:
-
虽然没有强制规定,但按照约定最好特性类型的名字都以Attribute结尾;
-
在C#中为了方便起见,使用特性时都可以省略特性名字后的Attribute,例如上述代码中的[MyCustom("UseMyCustomAttribute")]代替了[MyCustomAttribute("UseMyCustomAttribute")];
-
特性类型自身也可以添加其他的特性;