Add attribute article (#30734)
This commit is contained in:
committed by
Randell Dawson
parent
a191a2b2bd
commit
0d5389a370
68
guide/english/csharp/attributes/index.md
Normal file
68
guide/english/csharp/attributes/index.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
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)
|
Reference in New Issue
Block a user