C# AttributeUsage
创始人
2024-05-28 09:45:41
0

C# AttributeUsage

预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。

规定该特性的语法如下:

[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]

validon:自定义特性的对象,可以是类、方法、属性等对象(默认值是 AttributeTargets.All)AttributeTargets 所有类型如下 可以使用 或运算符 |
AttributeTargets.All = AttributeTargets.Assembly | AttributeTargets.Module 等所有组合

    [Flags]public enum AttributeTargets{Assembly = 1,Module = 2,Class = 4,Struct = 8,Enum = 16,Constructor = 32,Method = 64,Property = 128,Field = 256,Event = 512,Interface = 1024,Parameter = 2048,Delegate = 4096,ReturnValue = 8192,GenericParameter = 16384,All = 32767}

AllowMultiple:是否允许被多次使用(默认值为false:单用的)
Inherited:是否可被派生类继承(默认值为false:不能)

定义如下

using System;// 定义一个 NpcAttribute,
// AttributeTargets.Class标记为类Class 使用
// AllowMultiple = true 可以多次使用
// Inherited = true 可以被继承/派生子类
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class NpcAttribute : Attribute
{public NpcAttribute(){}
}

使用如下

// 标记 NpcClass 类使用 NpcAttribute 属性
[Npc]
public class NpcClass
{
}
NpcClassExtend  继承 NpcClass
public class NpcClassExtend : NpcClass
{
}

标记了属性,如何使用、获取如下

private void NpcTest(){// 实例一个对象NpcClass npcClass = new NpcClass();// 获取对象类型Type t = npcClass.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), true);if (null != objAttrs && objAttrs.Length > 0){for (int i = 0; i < objAttrs.Length; ++i){object temp = objAttrs[i];// 类型转换NpcAttribute npcAttribute = temp as NpcAttribute;// 获取类型Debug.LogError("NpcClass 获取到 NpcAttribute:" + npcAttribute.ToString());}}else{Debug.LogError("NpcClass 未找到 NpcAttribute");}// 上面执行打印结果// t.Name:NpcClass// NpcClass 获取到 NpcAttribute:NpcAttribute}private void NpcExtendTest(){// 实例一个对象NpcClassExtend npcClassExtend = new NpcClassExtend();// 获取对象类型Type t = npcClassExtend.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), false);if (null != objAttrs && objAttrs.Length > 0){for (int i = 0; i < objAttrs.Length; ++i){object temp = objAttrs[i];// 类型转换NpcAttribute npcAttribute = temp as NpcAttribute;// 获取类型Debug.LogError("NpcClassExtend 获取到 NpcAttribute:" + npcAttribute.ToString());}}else{Debug.LogError("NpcClassExtend 未找到 NpcAttribute");}// 上面执行打印结果// t.Name:NpcClassExtend// NpcClassExtend 获取到 NpcAttribute:NpcAttribute// 如果上面代码修改,第二个参数 inherit 为 false// object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), false);// 执行打印结果// t.Name:NpcClassExtend// NpcClassExtend 未找到 NpcAttribute// 因为 NpcClass 标记了[Npc],NpcClassExtend 继承了 NpcClass// 获取时如果函数 GetCustomAttributes(Type attributeType, bool inherit)中 inherit 赋值为 false// 则 NpcClassExtend 无法获取到 NpcAttribute 属性}

修改

// Inherited = false 不允许派生、继承
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class NpcAttribute : Attribute
{public NpcAttribute(){}
}

下面获取的 objAttrs 中是获取不到 NpcAttribute 的

 // 实例一个对象NpcClassExtend npcClassExtend = new NpcClassExtend();// 获取对象类型Type t = npcClassExtend.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), true);

AllowMultiple = true 作用,允许多次使用,代码如下

[Npc]
[Npc]
[Npc]
public class NpcClass
{}
    private void NpcTest(){// 实例一个对象NpcClass npcClass = new NpcClass();// 获取对象类型Type t = npcClass.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), true);if (null != objAttrs && objAttrs.Length > 0){for (int i = 0; i < objAttrs.Length; ++i){object temp = objAttrs[i];// 类型转换NpcAttribute npcAttribute = temp as NpcAttribute;// 获取类型Debug.LogError("NpcClass 获取到 NpcAttribute:" + npcAttribute.ToString());}}else{Debug.LogError("NpcClass 未找到 NpcAttribute");}// 上面执行打印结果// t.Name:NpcClass// NpcClass 获取到 NpcAttribute:NpcAttribute// NpcClass 获取到 NpcAttribute:NpcAttribute// NpcClass 获取到 NpcAttribute:NpcAttribute}

上面代码打印了三行 NpcClass 获取到 NpcAttribute:NpcAttribute,是因为NpcClass使用了三次标记[Npc]

修改代码,将 AllowMultiple 赋值为 false

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class NpcAttribute : Attribute
{public NpcAttribute(){}
}

则 NpcClass 报错,多次使用了 Npc 属性
Assets\Script\NpcClass.cs(6,2): error CS0579: Duplicate ‘Npc’ attribute

定义可传参数的属性,修改代码如下

using System;[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class NpcAttribute : Attribute
{private string _descript;public NpcAttribute(string descript){_descript = descript;}public string Descript{get { return _descript; }}
}[Npc("Npc 添加一次 ")]
[Npc("Npc 添加二次 ")]
[Npc("Npc 添加三次 ")]
public class NpcClass
{
}public class NpcClassExtend : NpcClass
{}private void NpcTest(){// 实例一个对象NpcClass npcClass = new NpcClass();// 获取对象类型Type t = npcClass.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), true);if (null != objAttrs && objAttrs.Length > 0){for (int i = 0; i < objAttrs.Length; ++i){object temp = objAttrs[i];// 类型转换NpcAttribute npcAttribute = temp as NpcAttribute;// 获取类型Debug.LogError("NpcClass 获取到 NpcAttribute:" + npcAttribute.ToString() + "   " + npcAttribute.Descript);}}else{Debug.LogError("NpcClass 未找到 NpcAttribute");}// 上面执行打印结果// t.Name:NpcClass// NpcClass 获取到 NpcAttribute:NpcAttribute   Npc 添加一次 // NpcClass 获取到 NpcAttribute:NpcAttribute   Npc 添加二次 // NpcClass 获取到 NpcAttribute:NpcAttribute   Npc 添加三次 }private void NpcExtendTest(){// 实例一个对象NpcClassExtend npcClassExtend = new NpcClassExtend();// 获取对象类型Type t = npcClassExtend.GetType();// 打印类型名Debug.LogError("t.Name:" + t.Name);// 获取 typeof(NpcAttribute) 属性, true 包含继承的object[] objAttrs = t.GetCustomAttributes(typeof(NpcAttribute), true);if (null != objAttrs && objAttrs.Length > 0){for (int i = 0; i < objAttrs.Length; ++i){object temp = objAttrs[i];// 类型转换NpcAttribute npcAttribute = temp as NpcAttribute;// 获取类型Debug.LogError("NpcClassExtend 获取到 NpcAttribute:" + npcAttribute.ToString() + "   " + npcAttribute.Descript);}}else{Debug.LogError("NpcClassExtend 未找到 NpcAttribute");}// 上面执行打印结果// t.Name:NpcClassExtend// NpcClassExtend 获取到 NpcAttribute:NpcAttribute   Npc 添加一次 // NpcClassExtend 获取到 NpcAttribute:NpcAttribute   Npc 添加二次 // NpcClassExtend 获取到 NpcAttribute:NpcAttribute   Npc 添加三次 }

相关内容

热门资讯

追悼会家属答谢词 追悼会家属答谢词尊敬的各位领导,各位亲朋好友,感谢各位今天出席亡母的追悼会。在母亲生病住院期间,承蒙...
重阳节活动主持词开场白 重阳节活动主持词开场白  在这金秋送爽,硕果累累的时节,我们迎来了又一个九九重阳节。下面是小编精心为...
郭德纲相声小段子台词 郭德纲相声小段子台词  相声,一种民间说唱曲艺。它以说,学,逗,唱为形式,突出其特点。下面是小编整理...
《将夜》经典台词 《将夜》经典台词  1.这片海洋,当时这里还有日出,在阳光的照射下,这片海洋是透明的',看上去就像是...
晚会主持词 【实用】晚会主持词(精选17篇)  主持词是主持人在节目进行过程中用于串联节目的串联词。在如今这个时...
春节晚会主持词 给力春节晚会主持词(通用3篇)  主持词的写作需要将主题贯穿于所有节目之中。在现今人们越来越重视活动...
婚礼上领导致辞 婚礼上领导致辞(通用7篇)  在日复一日的学习、工作或生活中,大家都经常接触到致辞吧,致辞要求风格的...
晚会结束语 晚会结束语(通用13篇)  闭幕词是一些大型会议结束时由有关领导人或德高望重者向会议所作的讲话。具有...
介绍毕业典礼舞蹈追梦的主持词 介绍毕业典礼舞蹈追梦的主持词(精选6篇)  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观...
员工誓师大会主持词 员工誓师大会主持词  誓师大会,又名 造势大会,两者皆可以称为“誓师会”,“造势会”,不过如此公共关...
教职工运动会入场式解说词 教职工运动会入场式解说词  在快速变化和不断变革的今天,我们可以使用解说词的机会越来越多,解说词让观...
央视春晚小品的经典台词 央视春晚小品的经典台词  小品《快乐老爸》  为了狗大点事,你还要得学门外语呀?  他是用泪水洗刷自...
《遇见王沥川》的经典台词 《遇见王沥川》的经典台词  1、爱情是干渴的,除非你遇上一个像沥川那样的.男人。  2、爱情是进行时...
回门宴主持词开场白   回门宴主持词开场白  亲爱的各位来宾,各位亲朋好友,先生们,女士们大家上午好! 玉兔奔月去,祥龙...
培训会议结束语 培训会议结束语(精选5篇)  总结是对某一阶段的工作、学习或思想中的经验或情况进行分析研究的书面材料...
新年联欢晚会开场白主持词   2位主持人同时出场  谢:尊敬的各位来宾  陈:亲爱的朋友们  合:新年好!  谢:时间如流水,...
结婚拜天地主持词 结婚拜天地主持词(精选8篇)  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在各种集...
主持人主持词 主持人主持词范本6篇  主持词是各种演出活动和集会中主持人串联节目的串联词。时代不断在进步,司仪等是...
春节团拜会主持词 春节团拜会主持词  主持词的写作要突出活动的主旨并贯穿始终。在一步步向前发展的社会中,主持人参与的事...
《大内密探灵灵狗》的搞笑台词 《大内密探灵灵狗》的搞笑台词  1、丽妃娘娘打扮停当,来到寝宫,皇帝一脸苦相地迎上去:美人,你是不是...