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 添加三次 }

相关内容

热门资讯

管门口的金毛四年级作文【推荐... 管门口的金毛四年级作文 篇一我家门口有一只非常可爱的金毛犬,它是我们的守门员,每天都在门口忠实地守卫...
我的压岁钱小学四年级作文【通... 我的压岁钱小学四年级作文 篇一我的压岁钱春节是我最喜欢的节日,因为我可以收到压岁钱。每年过年的时候,...
致那份友谊小学作文(推荐3篇... 致那份友谊小学作文 篇一友谊的力量亲爱的友谊小学的老师们和同学们:我是一名来自友谊小学的学生,今天我...
为自己喝彩小学生作文【精简6... 为自己喝彩小学生作文 篇一我是一名小学生,每天都在学校度过快乐的时光。我喜欢上学,因为学校给了我很多...
我生病了小学作文【精简6篇】 我生病了小学作文 篇一我生病了前几天,我不知道怎么了,突然感觉身体不舒服。我感到头晕目眩,喉咙痛得像...
新学期新打算小学作文450字... 新学期新打算篇一:我要努力学习新的学期开始了,我制定了新的打算,那就是要努力学习。我相信只有努力学习...
我学会了西红柿炒鸡蛋小学作文... 我学会了西红柿炒鸡蛋小学作文 篇一我学会了西红柿炒鸡蛋上周,我学会了一道简单又美味的菜——西红柿炒鸡...
花朵的小学作文【最新3篇】 花朵的小学作文 篇一花朵的奇妙世界花朵是大自然的美丽礼物,它们以各种各样的颜色和形状装点着我们的环境...
小学生赏花的作文【通用4篇】 小学生赏花的作文 篇一春天是一个充满美丽花朵的季节,我非常喜欢春天。每当春天来临,我就会和家人一起去...
中秋之夜小学生作文【优选3篇... 中秋之夜小学生作文 篇一中秋之夜,月亮圆圆的,像一块白玉挂在天空中。我和爸爸妈妈一起出门,欣赏美丽的...
油面筋塞肉小学作文(推荐3篇... 油面筋塞肉小学作文 篇一我喜欢吃美食,尤其是一些特色的小吃。最近,我发现了一种非常好吃的小吃,那就是...
学游泳的小学作文(实用3篇) 学游泳的小学作文 篇一学游泳的小学作文大家好!我是小明,今天我要给大家分享一下我学游泳的经历。我是一...
小学生作文老师我想对你说【最... 小学生作文老师我想对你说 篇一尊敬的老师:您好!我是您的学生小明。我想借这篇作文向您表达我的感激之情...
一次有趣的实验小学生作文80... 一次有趣的实验篇一昨天,我参加了一次非常有趣的实验。老师让我们小组一起进行,我非常期待这个实验的结果...
春天小学一年级作文300字【... 春天小学一年级作文300字 篇一我的春天春天来了,大地上百花盛开,绿草如茵。我喜欢春天,因为春天是个...
校园的一角的作文【优选6篇】 校园的一角的作文 篇一校园的一角在校园的一角,有一个小花园,是我最喜欢的地方。虽然它不大,但却别有一...
参观科技馆的小学作文400字... 参观科技馆的小学作文400字 篇一:奇妙的科技世界我参观了我们学校附近的科技馆,这里展示了许多令人惊...
值得的学生作文【实用3篇】 值得的学生作文 篇一突破自我,迈向成功作为一名学生,我们应该时刻保持一种积极向上的心态,勇于追求进步...
走进直播间小学作文(最新4篇... 走进直播间小学作文 篇一近年来,随着互联网技术的快速发展,直播已经成为了一种非常流行的媒体形式。除了...
我的学校小学作文350字【精... 我的学校小学作文350字 篇一我所在的学校是一所小学,位于市区的中心地带。学校占地面积较小,但是设施...