The C# language can be extended. Attributes extend classes and types. This C# feature allows you to attach declarative information to any type.
Attributes are accessed at compile-time or runtime through the metadata. In our C# programs we then can handle types based on their attributes.
This program provides an example of the Obsolete attribute. The Obsolete attribute is a way to declare that a method is deprecated and should be avoided.
ObsoleteAttribute
," but you can omit the word Attribute.Program.Text
method. It doesn't affect runtime.using System; class Program { static void Main() { // Warning: 'Program.Test()' is obsolete Test(); } [Obsolete] static void Test() { } }'Program.Test()' is obsolete
An attribute is a class
that is derived from the Attribute class
through inheritance. Often, we put an attribute on the class
itself.
class
that can only be attached to class
types—not fields, methods, or properties.using System; /// <summary> /// An attribute that can only be attached to classes. /// </summary> [AttributeUsage(AttributeTargets.Class)] public class PerlsAttribute : Attribute { } /// <summary> /// Use short syntax to reference attribute. /// </summary> [Perls] class Example1 { } /// <summary> /// Use long syntax to reference attribute. /// </summary> [PerlsAttribute] class Example2 { } class Program { static void Main() { // For compilation. } }
This example includes a string
member field, a property accessor to that field, and a constructor. With this version of PerlsAttribute
, we must use a string
parameter.
using System; /// <summary> /// Attribute. /// </summary> [AttributeUsage(AttributeTargets.Class)] public class PerlsAttribute : Attribute { /// <summary> /// Stores string field. /// </summary> string _id; /// <summary> /// Attribute constructor. /// </summary> public PerlsAttribute(string id) { this._id = id; } /// <summary> /// Get Id. /// </summary> public string Id { get { return this._id; } } } /// <summary> /// Apply attribute. /// </summary> [Perls("Dot")] class Example1 { } class Program { static void Main() { // For compilation. } }
The C# specification recommends that named parameters be used. They are not as likely to be invalidated when the attribute declaration changes.
using System; /// <summary> /// Attribute. /// </summary> [AttributeUsage(AttributeTargets.Class)] public class PerlsAttribute : Attribute { /// <summary> /// String field. /// </summary> string _id; /// <summary> /// Attribute constructor. /// </summary> public PerlsAttribute() { } /// <summary> /// Get and set. /// </summary> public string Id { get { return this._id; } set { this._id = value; } } } /// <summary> /// Set property in the attribute. /// </summary> [Perls(Id = "Sam")] class Example1 { } class Program { static void Main() { // For compilation. } }
AllowMultiple
By default an attribute can only be specified a single time on a member or type declaration. To bypass this restriction, use AllowMultiple
.
Custom attributes are of fairly limited use. But they provide many options for extensibility. With them we attach declarative information to members and types.