预定义特性AttributeUsage描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。
规定该特性的语法如下:
[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]
validon:自定义特性的对象,可以是类、方法、属性等对象(默认值是 AttributeTargets.All)
AllowMultiple:是否允许被多次使用(默认值为false:单用的)
Inherited:是否可被派生类继承(默认值为false:不能)
下面请看使用:
using System;
namespace AttributeUsagePractice
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{
public HelpAttribute(String Description_in)
{
this.description = Description_in;
}
protected String description;
public String Description
{
get { return this.description; }
}
}
class Program
{
[Help("this is a main class")] //error
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
含义为:定制特性类,不允许多次使用,不能被继承
第一个参数:
因为它的特性目标是 AttributeTargets.Class,而它放在函数前面,所以上面的程序会报错:特性“Help”对此声明类型无效。它只对“class”声明有效,正确的做法是放在 class Program 上面。
如果是下面的代码:
using System;
namespace AttributeUsagePractice
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{
public HelpAttribute(String Description_in)
{
this.description = Description_in;
}
protected String description;
public String Description
{
get { return this.description; }
}
}
[Help("this is a main class")]
[Help("this is a main2 class")] //error
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
第二个参数:
因为AllowMultiple = false,上面多次使用,所以报错 重复的“Help”特性,正确的做法就是去掉它
using System;
using System.Linq;
namespace AttributeUsagePractice
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{
public HelpAttribute(){}
public HelpAttribute(String Description_in)
{
this.description = Description_in;
}
protected String description;
public String Description
{
get { return this.description; }
}
}
[Help("this is a HelpAttribute use class")]
public class UseHelpAttribute
{
}
public class UseHelpAttributeDerive : UseHelpAttribute
{
}
class Program
{
public static void Main(string[] args)
{
// TODO: Implement Functionality Here
UseHelpAttributeDerive objHelpAttribute = new UseHelpAttributeDerive();
Type t = objHelpAttribute.GetType();
object [] objAttrs = t.GetCustomAttributes(typeof(HelpAttribute),true);
if(objAttrs!= null && objAttrs.Length > 0)
{
object temp = objAttrs.First();
HelpAttribute myAttr = temp as HelpAttribute;
Console.WriteLine("类描述:{0}", myAttr.Description);
}
else
{
Console.WriteLine("没有类描述");
}
Console.ReadKey(true);
}
}
}
第三个参数:
因为Inherited = false,所以运行结果为;
如果把Inherited = false 改为 Inherited = true,效果如下:
到此这篇关于C# 特性AttributeUsage的理解与使用的文章就介绍到这了,更多相关C# AttributeUsage使用内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!