2.5 KiB
title
title |
---|
Attributes |
Attributes
Attributes allow the programmer to add metadata to assemblies, types, and members. When applied to a type or member, an attribute will take the form of [Attribute]
or [Attribute(args)]
. When applied to an assembly, an attribute will take the form of [assembly:Attribute]
or [assembly:Attribute(args)]
.
An attribute is any class that inherits from the parent Attribute
type. Conventionally, the name of an attribute in its definition will be SomethingAttribute
, rather than just Something
. When used, [Something]
will still compile:
public class PluginAttribute : Attribute
{
// Attribute members
}
[Plugin]
public class MyPlugin
{
// Plugin members
}
As mentioned above, attributes can have constructors like any other class. However, all arguments in an attribute constructor must be compile-time constants.
public static class Variables // For the purposes of demonstration
{
public static string MyPluginName = "Cool Plugin";
public const string MyConstPluginName = "Amazing Plugin";
}
public class PluginAttribute : Attribute
{
public string Name { get; private set; }
public PluginAttribute(string name)
{
Name = name;
}
}
[Plugin(MyPluginName)] // Won't compile because MyPluginName isn't const
[Plugin(MyConstPluginName)] // OK
[Plugin("My Cool Plugin")] // OK
public class MyPlugin
{
// Plugin members
}
Accessing a Type's Attributes
The System.Attribute.GetCustomAttributes(Type)
method returns an array of all the attributes applied to a type. The programmer can then loop through this array to find the desired attribute using the is
keyword.
public void PrintPluginName()
{
var type = typeof(MyPlugin); // Returns a Type object representing our MyPlugin class
var attributes = System.Attribute.GetCustomAttributes(type); // Returns an Attribute[]
foreach (var a in attributes)
{
if (a is PluginAttribute plugin)
Console.WriteLine($"Plugin Name: {plugin.Name}");
}
}