C#中Attribute的继承
在C#中Attribute是个非常有用的语法,本文不会介绍Attribute的使用方法,如果想了解Attribute的详细信息请查阅MSDN及网上相关文档。C#中的Attribute有两个地方是和继承相关的,一个地方是AttributeUsageAttribute类中的属性参数Inherited,另一个地方是Type反射中的GetCustomAttributes方法(包括Type.GetCustomAttributes、MemberInfo.GetCustomAttributes等反射方法)的inherit参数,这两个与继承相关的参数都是bool类型,但是代表的含义却不相同,我们来看看他们分别代表的是什么:
AttributeUsageAttribute类的Inherited属性参数
AttributeUsage中的属性参数Inherited指的是继承链中的子类和子类成员是否能继承在父类和父类成员上声明的Attribute。我们来看个例子,假如现在我们有两个类BaseClass和MyClass,其中MyClass继承于BaseClass,现在我们在BaseClass上声明一个自定义Attribute叫MyAttribute,代码如下:
[My]
class BaseClass
{ } class MyClass:BaseClass
{ }
如果像下面代码中设置MyAttribute上AttributeUsage的属性参数Inherited为true,则代表MyAttribute是可以被继承声明的,也就是说上面代码中在父类BaseClass上声明了MyAttribute后,子类MyClass相当于也声明了MyAttribute。
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class MyAttribute : Attribute
{
}
如果像下面代码中设置MyAttribute上AttributeUsage的属性参数Inherited为false,那么代表MyAttribute是无法被继承声明的,也就是说上面代码中在父类BaseClass上声明了MyAttribute后,子类MyClass不具有MyAttribute,相当于父类BaseClass声明了MyAttribute但是子类MyClass没有声明MyAttribute。
[AttributeUsage(AttributeTargets.All, Inherited = false)]
class MyAttribute : Attribute
{
}
GetCustomAttributes方法的inherit参数
GetCustomAttributes方法中inherit参数指的是当调用GetCustomAttributes方法时,GetCustomAttributes方法是否搜索子类和子类成员上从父类继承的Attribute。同样我们来看个例子,假如现在我们有两个类BaseClass和MyClass,其中MyClass继承于BaseClass,现在我们在BaseClass上声明一个自定义Attribute叫MyAttribute,代码如下:
[My]
class BaseClass
{ } class MyClass:BaseClass
{ }
我们在MyAttribute上设置AttributeUsage的属性参数Inherited为true,那么相当于子类MyClass上也声明了MyAttribute:
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class MyAttribute : Attribute
{
}
现在如果我们调用构造函数构造一个MyClass对象,然后调用对象的反射方法GetCustomAttributes看是否能在MyClass上找到MyAttribute。如果找到了则在控制台输出找到了MyAttribute,否则输出没有找到。
首先我们调用GetCustomAttributes方法时将参数inherit设置为true。结果控制台显示:"MyAttribute found!",说明GetCustomAttributes方法成功找到了MyAttribute。
var my = new MyClass();
var myMyAttribute = my.GetType().GetCustomAttributes(typeof(MyAttribute), true); if (myMyAttribute != null && myMyAttribute.Count() > )
{
Console.WriteLine("MyAttribute found!");
}
else
{
Console.WriteLine("MyAttribute not found!");
}
接着我们调用GetCustomAttributes方法时将参数inherit设置为false。这次控制台显示:"MyAttribute not found!",说明将参数inherit设置为false后GetCustomAttributes方法无法在MyClass上找到MyAttribute了。
var my = new MyClass();
var myMyAttribute = my.GetType().GetCustomAttributes(typeof(MyAttribute), false); if (myMyAttribute != null && myMyAttribute.Count() > )
{
Console.WriteLine("MyAttribute found!");
}
else
{
Console.WriteLine("MyAttribute not found!");
}
这说明GetCustomAttributes方法的inherit参数实际上就是在指示是否去搜索从父类继承来的Attribute,由于本例中的MyAttribute是声明在父类BaseClass上的,所以当在子类MyClass的反射中调用GetCustomAttributes(typeof(MyAttribute), false)时,GetCustomAttributes方法将不会去搜索从父类继承的Attribute,所以在控制台上显示MyClass上无法找到MyAttribute。但是如果在子类MyClass的反射中调用GetCustomAttributes(typeof(MyAttribute), true),那么GetCustomAttributes方法不光会搜索子类MyClass自己声明的Attribute还会去搜索从父类BaseClass继承的Attribute,由于父类BaseClass上声明了MyAttribute,所以GetCustomAttributes方法在子类MyClass上也能找到MyAttribute,最后在控制台上显示在MyClass上找到了MyAttribute。如果将MyAttribute声明在子类MyClass上而不是像本例代码一样声明在父类BaseClass上,那么在调用GetCustomAttributes(typeof(MyAttribute), false)时,就会显示在MyClass上找到MyAttribute了。
总结一下,我们可以看到AttributeUsageAttribute类的Inherited属性参数和GetCustomAttributes方法的inherit参数代表的含义是不一样的。AttributeUsageAttribute类的Inherited属性代表的是父类或父类成员上声明的Attribute是否能够被应用到继承链中子类或子类成员上去。而GetCustomAttributes方法的inherit参数代表的是调用GetCustomAttributes方法时是否去搜索继承链中从父类或父类成员继承下来的Attribute。
C#中Attribute的继承的更多相关文章
- JS中的原型继承机制
转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很 ...
- C#中是否可以继承String类
C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- C#中事件的继承
C#中的子类无法调用父类的事件,可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件. class parent { protected string name; publ ...
- C++中的虚继承 & 重载隐藏覆盖的讨论
虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1. ...
- python中使用多继承
python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...
- Django中的Model继承
Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...
- 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)
一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性.当一个类继承其他类时,继承类叫子类(subclass),被继承类叫超类(或父类,supercla ...
- javascript中的原型继承
在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...
随机推荐
- 怎么清除file控件的文件路径
还记得上次做一个文件上传,后来测试告诉我说,如果我要是不选择文件了呢?该怎么办?我说:简单啊,做一个取消按钮不就完事了吗!然后我就想一个file空间做一个取消是多么简单的事,用js处理可是想怎么样就怎 ...
- Car---hdu5935(简单题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5935 题意:有一辆车在马路上行驶,速度不变或增加,然后警察在某整数点时刻记录下了这辆车所经过的位置,共 ...
- TestNG学习-001-基础理论知识
此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...
- angularJs的工具方法
- mysql怎么定义外键
数据库mysql 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引 ...
- 作业一直"执行"
背景:一个作业有7个步骤,前面的步骤成功/失败都转到下一步,直至最后退出,作业计划是每天早上8点执行.步骤中的语句是例行检查脚本,之前的历史记录都是一分钟内完成.此次重启数据库服务器后,检查发现此作业 ...
- .Net内存优化的几点经验
以前从来没有想过.Net开发居然存在内存无法释放的问题,总是认为GC给我处理好了一切.现在GIS二次开发结合三维球开发,没有想到存在如此严重的内存增长,很快内存就不够用了,导致系统各种不稳定.球体和三 ...
- 一个WebService Demo
1.建立一个Asp.net Web网站,添加新项Web服务MyMath.asmx.编写如下代码: using System; using System.Collections.Generic; usi ...
- iOS 自定义UITabBarController的tabBar
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDeleg ...
- RPC、SQL、NFS属于OSI的哪一层
第一层:物理层 第二层:数据链路层 802.2.802.3ATM.HDLC.FRAME RELAY 第三层:网络层 IP.IPX.ARP.APPLETALK.ICMP 第四层:传输层 TCP.UDP. ...