69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | 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: | ||
|  | ```csharp | ||
|  | 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. | ||
|  | ```csharp | ||
|  | 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. | ||
|  | ```csharp | ||
|  | 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}"); | ||
|  | 	} | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Additional Information
 | ||
|  | * [Attributes - Microsoft Programming Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/) | ||
|  | * [Accessing Attributes Using Reflection - Microsoft Programming Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/accessing-attributes-by-using-reflection) | ||
|  | * [Creating Custom Attributes - Microsoft Programming Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes) |