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)
							 |