理解AttributeUsage类
类定义:
// 摘要:
// 指定另一特性类的用法。 此类不能被继承。
[Serializable]
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
[ComVisible(true)]
public sealed class AttributeUsageAttribute : Attribute
{
// 摘要:
// 用指定的 System.AttributeTargets、System.AttributeUsageAttribute.AllowMultiple
// 值和 System.AttributeUsageAttribute.Inherited 值列表初始化 System.AttributeUsageAttribute
// 类的新实例。
//
// 参数:
// validOn:
// 使用按位"或"运算符组合的一组值,用于指示哪些程序元素是有效的。
public AttributeUsageAttribute(AttributeTargets validOn); // 摘要:
// 获取或设置一个布尔值,该值指示能否为一个程序元素指定多个指示属性实例。
//
// 返回结果:
// 如果允许指定多个实例,则为 true;否则为 false。 默认值为 false。
public bool AllowMultiple { get; set; }
//
// 摘要:
// 获取或设置一个布尔值,该值指示指示的属性能否由派生类和重写成员继承。
//
// 返回结果:
// 如果该属性可由派生类和重写成员继承,则为 true,否则为 false。 默认值为 true。
public bool Inherited { get; set; }
//
// 摘要:
// 获取一组值,这组值标识指示的属性可应用到的程序元素。
//
// 返回结果:
// 一个或多个 System.AttributeTargets 值。 默认值为 All。
public AttributeTargets ValidOn { get; }
}
从AttributeUsage特性的名称上就可以看出它用于描述特性的使用方式。具体来说,首先应该是其所标记的特性可以应用于哪些类型或者对象。AttributeUsage特性的构造函数接受一个 AttributeTargets 类型的参数。
AttributeTargets 是一个位标记,它定义了特性可以应用的类型和对象:
// 摘要:
// 指定可以对它们应用特性的应用程序元素。
[Serializable]
[ComVisible(true)]
[Flags]
public enum AttributeTargets
{
// 摘要:
// 可以对程序集应用属性。
Assembly = ,
//
// 摘要:
// 可以对模块应用属性。
Module = ,
//
// 摘要:
// 可以对类应用属性。
Class = ,
//
// 摘要:
// 可以对结构应用属性,即值类型。
Struct = ,
//
// 摘要:
// 可以对枚举应用属性。
Enum = ,
//
// 摘要:
// 可以对构造函数应用属性。
Constructor = ,
//
// 摘要:
// 可以对方法应用属性。
Method = ,
//
// 摘要:
// 可以对属性 (Property) 应用属性 (Attribute)。
Property = ,
//
// 摘要:
// 可以对字段应用属性。
Field = ,
//
// 摘要:
// 可以对事件应用属性。
Event = ,
//
// 摘要:
// 可以对接口应用属性。
Interface = ,
//
// 摘要:
// 可以对参数应用属性。
Parameter = ,
//
// 摘要:
// 可以对委托应用属性。
Delegate = ,
//
// 摘要:
// 可以对返回值应用属性。
ReturnValue = ,
//
// 摘要:
// 可以对泛型参数应用属性。
GenericParameter = ,
//
// 摘要:
// 可以对任何应用程序元素应用属性。
All = ,
}
AllowMutiple 属性用于设置该特性是不是可以重复地添加到一个类型上(默认为false)。
Inherited 就更复杂一些了,假如有一个类继承自我们的DemoClass,那么当我们将RecordAttribute添加到DemoClass上时,DemoClass的子类也会获得该特性。而当特性应用于一个方法,如果继承自该类的子类将这个方法覆盖,那么Inherited则用于说明是否子类方法是否继承这个特性。
c#自定义Attribute例子:
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited=false, AllowMultiple=true)]
public class RecordAttribute : Attribute
{
public string RecordType { get; private set; }
public string Author { get; private set; }
public DateTime Date { get; private set; }
public string Memo { get; set; } public RecordAttribute(string recordType, string author, string date)
{
this.RecordType = recordType;
this.Author = author;
this.Date = Convert.ToDateTime(date);
}
}
使用该特性:
    [Record("更新", "zwk", "2015-01-01",Memo="优化")]
    [Record("更新", "zwk", "2015-01-02", Memo = "优化")]
参考:http://www.csharpwin.com/csharpspace/7700r2735.shtml
理解AttributeUsage类的更多相关文章
- Python之美[从菜鸟到高手]--深刻理解原类(metaclass)
		
本来想自己写这篇文章的,可当我读了这篇文章http://blog.jobbole.com/21351/,我打消了这个念头,因为肯定写的没有人家的好,说的通俗易懂,面面俱到.就厚着面皮修改下格式,测试下 ...
 - 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
		
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
 - Java基础系列2:深入理解String类
		
Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...
 - 深入浅出理解QTimeLine类
		
网上找了下QTimeLIne类的介绍,要么就是代码一贴自己看去,要么就是说不到重点,正巧自己项目遇到这个类,在这里写一下,给需要的同学看下. 因为我最近需要有动画方面配合时间间隔触发QGraphics ...
 - 跟着刚哥梳理java知识点——深入理解String类(九)
		
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...
 - 初识Hibernate之理解持久化类
		
上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射.但是至于其中的一些更加细节的地方并没有 ...
 - 关于理解python类的小题
		
今天看了python部落翻译的一篇<一道python类的小题>文章,感觉挺有启发性,记录下来: print('A') class Person(object): print('B') de ...
 - Java基础12:深入理解Class类和Object类
		
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
 - 深入理解String类详解
		
1.Stringstr = "eee" 和String str = new String("eee")的区别 先看一小段代码, 1 public static ...
 
随机推荐
- unity3d四元数和旋转矩阵
			
http://blog.csdn.net/kfqcome/article/details/10729551 一 四元数 Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对 ...
 - 洛谷P2134 百日旅行
			
P2134 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.——小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场大考时默 ...
 - es备份索引
			
1.解压https://github.com/medcl/esm-abandonedhttps://github.com/medcl/esm-abandoned/releases tar xf lin ...
 - hdu2027 trie树 字典树模板
			
#include <iostream> #include <cstdio> #include <cstring> #include <sstream> ...
 - 命令行音乐播放器 CMus
			
自从接触到 CMus (C* Music Player) 这个工作在终端里的音乐播放器后,在 Linux 环境里就很少使用 GUI 音乐播放器播放本地音乐文件了.它消耗资源少使用方便,对中文的支持也不 ...
 - GUI的最终选择 Tkinter(六):Canvas组件
			
Canvas组件,是一个可以让你任性的组件,一个可以让你随心所欲地绘制界面的组件.Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线,圆形,多边形,甚至是绘制其他组件. 在Ca ...
 - HDU 1114 Piggy-Bank 完全背包 dp
			
http://acm.hdu.edu.cn/showproblem.php?pid=1114 完全背包的题目,要求输出最小价值.然后一定要把给出的背包重量全部用完. 就是问一个背包为k的大小,n件物品 ...
 - Android sdk manager 显示 “Done loading packages”,该怎么办?
			
试了这个方法:请用管理员的身份运行"SDK Manager.exe".不管用. 下面的方法可以: 在SDK Manager下Tools->Options打开了SDK Mana ...
 - 【.Net MVC4 connectionString设置】获取SQL server数据库的连接字符串
			
第一步:创建向导文件 在桌面创建一个txt文件,并将文件后缀改成“.udl”. 第二步:选择“提供程序”tab页 双击新创建的“.udl”文件,进入后选择“提供程序”tab页,选择“Micros ...
 - Random类、ThreadLocalRandom类
			
Random和ThreadLocalRandom类均用于生成伪随机数. Random的构造函数: Random() 默认以系统当前时间为种子,相当于Random(System.currentT ...