C#中,AttributeUsage是一个属性用来控制自定义Attribute(即自定义注解)的使用方式。
AttributeUsage有三个构造函数参数,分别为:
1. AttributeTargets targets:使用该自定义Attribute的目标,也就是可以使用该自定义Attribute的程序元素,在C#语言中包括类、结构体、枚举、接口、方法、属性、字段、事件、委托等,当然也可以是Attribute。
2. bool AllowMultiple:该自定义Attribute是否允许应用多次,如果为false,则该Attribute不能重复应用在同一个程序元素上。
3. bool Inherited:该自定义Attribute是否可以被继承,如果为true,则该Attribute可以被子类继承。
下面通过示例来深入了解AttributeUsage的使用。
示例1:
自定义Attribute,用于标记方法:
```c#
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class MethodAttribute : Attribute
{
private string author;
public MethodAttribute(string author)
{
this.author = author;
}
public string Author
{
get { return this.author; }
}
}
```
在该Attribute的定义中,只允许将该Attribute应用在方法上,可以被继承但不能重复应用。
下面定义一个基类、一个子类,并都在其中定义一个方法,并分别在方法上添加MethodAttribute。
```c#
public class MyBaseClass
{
[Method("Tom")]
public virtual void MethodInMyBaseClass()
{
Console.WriteLine("Method in MyBaseClass.");
}
}
public class MySubClass : MyBaseClass
{
[Method("Jerry")]
public override void MethodInMyBaseClass()
{
Console.WriteLine("Method in MySubClass.");
}
}
```
在使用MethodAttribute标记方法后,可以使用反射获取该方法上的MethodAttribute,并获取该Attribute的属性值。
```c#
Type type = typeof(MySubClass);
MethodInfo method = type.GetMethod("MethodInMyBaseClass");
MethodAttribute attribute = Attribute.GetCustomAttribute(method, typeof(MethodAttribute)) as MethodAttribute;
if(attribute != null)
{
Console.WriteLine(attribute.Author);
}
```
输出结果为:Jerry,因为MySubClass重写了MyBaseClass的MethodInMyBaseClass方法,并在该方法上添加了MethodAttribute,所以获取到的MethodAttribute实例实际上是定义在MySubClass上的。
示例2:
自定义Attribute,用于标记类:
```c#
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ClassAttribute : Attribute
{
private string name;
public ClassAttribute(string name)
{
this.name = name;
}
public string Name
{
get { return this.name; }
}
}
```
在该Attribute的定义中,允许将该Attribute应用在类上,可以重复应用。
下面定义三个类,并在这些类上分别添加ClassAttribute。
```c#
[Class("Class1")]
public class MyClass1
{
public void Test()
{
Console.WriteLine("Test in MyClass1");
}
}
[Class("Class2"), Class("Class3")]
public class MyClass2
{
public void Test()
{
Console.WriteLine("Test in MyClass2");
}
}
[Class("Class3")]
public class MyClass3
{
public void Test()
{
Console.WriteLine("Test in MyClass3");
}
}
```
可以使用反射获取这些类上的ClassAttribute,并获取其属性值。
```c#
Type type1 = typeof(MyClass1);
ClassAttribute attribute1 = Attribute.GetCustomAttribute(type1, typeof(ClassAttribute)) as ClassAttribute;
if(attribute1 != null)
{
Console.WriteLine(attribute1.Name);
}
Type type2 = typeof(MyClass2);
ClassAttribute[] attributes2 = Attribute.GetCustomAttributes(type2, typeof(ClassAttribute)) as ClassAttribute[];
if(attributes2 != null)
{
foreach (ClassAttribute attribute in attributes2)
{
Console.WriteLine(attribute.Name);
}
}
Type type3 = typeof(MyClass3);
ClassAttribute attribute3 = Attribute.GetCustomAttribute(type3, typeof(ClassAttribute)) as ClassAttribute;
if (attribute3 != null)
{
Console.WriteLine(attribute3.Name);
}
```
输出结果为:
Class1
Class2
Class3
Class3
以上就是AttributeUsage的使用方法介绍和详细示例。通过对C#自定义Attribute的应用,可以让开发者更加灵活地控制程序行为和元数据信息,提高代码的可读性和可维护性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复