.NET中如何自定义一个特性?

除了直接使用.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")];

  • 特性类型自身也可以添加其他的特性;