C  AttributeUsage的使用浅析

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/

点赞(3) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部