C# 特性的学习(一)
来源:互联网 发布:网络摄像监控 编辑:程序博客网 时间:2024/06/11 18:48
1、什么是特性
2、特性的应用
自定义特定:
//限定特性类的应用范围
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field,AllowMultiple = true, Inherited = false)]
//定制MsgAttribute特性类,继承于Attribute
public class ClassMsgAttribute : Attribute
{
}
调用:
//在Person类上标记ClassMsg特性
[ClassMsg(Msg = "这是关于人的姓名信息的类")]
class Person
{
}
主函数的情况
GetCustomAttributes用于获取程序集的特性,也就是这个程序集合中包含了多少个特性
继续来一个简单的例子来说明定制特性:
usingSystem;
public classHelpAttribute: Attribute
{
}
不管你是否相信,我们上面已经建立了一个定制特性,现在我们可以用它来装饰现有的类就好像我们使用的Obsoleteattribute一样。
[Help()]
public classAnyClass
{
}
注意:对于一个特性类使用Attribute后缀是一个惯例。然而,如果不添加编译器会自动添加匹配。
定义或控制特性的使用
AttributeUsage类是另外一个预定义特性类,它帮助我们控制我们自己的定制特性的使用。它描述一个定制特性如何被使用。
下面通过实例来探讨下AttributeUsage的三个属性
1)我们将会在刚才的Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。
[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;
}
}
}
先让我们来看一下AttributeTargets.Class。它规定了Help特性只能被放在class的前面。这也就意味着下面的代码将会产生错误:
[Help("this is a do-nothing class")]
public class AnyClass
{
[Help("this is a do-nothing method")] //error
public void AnyMethod()
{
}
}
//编译器报告错误如下:
AnyClass.cs: Attribute 'Help' is not valid onthis declaration type.
It is valid on 'class' declarations only.
我们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值是:
Assembly,
Module,
Class,
Struct,
Enum,
Constructor,
Method,
Property,
Field,
Event,
Interface,
Parameter,
Delegate,
All = Assembly Module Class Struct Enum Constructor Method Property Field Event Interface Parameter Delegate,
ClassMembers = Class Struct Enum Constructor Method Property Field Event Delegate Interface )
下面考虑一下AllowMultiple =false。它规定了特性不能被重复放置多次
[Help("it contains a do-nothing method")]
public class AnyClass
{
[Help("this is a do-nothing method")] //error
public void AnyMethod()
{
}
}
它产生了一个编译期错误。
AnyClass.cs: Duplicate 'Help'attribute
Ok,现在我们来讨论一下最后的这个属性。Inherited,表明当特性被放置在一个基类上时,它能否被派生类所继承
[Help("BaseClass")]
public class Base
{
}
public class Derive : Base
{
}
这里会有四种可能的组合:
[AttributeUsage(AttributeTargets.Class,AllowMultiple = false, Inherited = false ]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true,Inherited = false ]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false,Inherited = true ]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true,Inherited = true ]
第一种情况:
如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。
和第一种情况相同,因为inherited也被设置为false。
为了解释第三种和第四种情况,我们先来给派生类添加点代码:
[Help("BaseClass")]
public class Base
{
}
[Help("DeriveClass")]
public class Derive : Base
{
}
现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。
在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。
转自:http://blog.csdn.net/helloguonan/article/details/5912032
- C# 特性的学习(一)
- C# 特性学习(二)
- C# Windows form 学习积累《一》
- C# 基本特性
- C# 多线程(一)
- C++ 学习 二
- openlayers 学习一
- 关于 YII 学习 的文章 连接
- C# 绘制曲线(一)
- OpenCV学习笔记(一) OpenCV的概…
- arcigis for javascript 学习(一…
- C# 虚函数 (转载)
- SSH Tunnel 实现VPN的功能(一)
- BootStrap 学习笔记(一)
- 2015 Objective-C 三大新特性
- C++ 指针学习累积(持续)
- Spring 事务管理(一)
- linux c 的错误判断
- C# GetType()与Typeof()的区别
- 构建Hadoop生态圈
- SELECT INTO 和 IN…
- SqlServer 事务的用法
- iOS中block介绍(四)揭开神秘面纱(下)
- C# 特性的学习(一)
- C# 特性学习(二)
- 正则表达式基础
- Winform 窗体最小化隐藏在桌…
- JS中的window.setTimeout()详解
- 如何用c# ConfigManage…
- MySQL安装-源码方式-linux下cmake源码安装mysql5.5.27
- aaa
- 画图解释SQL联合语句