C#特性
2016-03-31 23:19
302 查看
转自:
http://blog.csdn.net/nndtdx/article/details/6905802 http://www.cnblogs.com/luckdv/articles/Atrribute.html#3321438 http://www.cnblogs.com/kai364/p/4417436.html http://www.cnblogs.com/mahaisong/category/326195.html http://www.cnblogs.com/fenrir/archive/2008/09/08/1286388.html http://blog.csdn.net/yuwuji/article/details/6958304 http://www.cnblogs.com/ghfsusan/archive/2009/07/15/1524192.html(比较好的介绍) http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html http://blog.csdn.net/pan_junbiao/article/details/8461703 http://www.runoob.com/csharp/csharp-attribute.html http://www.cnblogs.com/xugang/archive/2011/01/06/1927619.html
C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用。其实AttributeUsage类就是描述了一个定制特性如和被使用。
C# AttributeUsage的使用要明白:
AttributeUsage有三个属性,我们可以把它放置在定制属性前面。第一个属性是:
◆ValidOn
通过这个属性,我们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作我们可以把若干个AttributeTargets值组合起来。
◆AllowMultiple
这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。
◆Inherited
我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。
C# AttributeUsage的使用实例:
下面让我们来做一些实际的东西。我们将会在刚才的Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。
先让我们来看一下AttributeTargets.Class。它规定了Help特性只能被放在class的前面。这也就意味着下面的代码将会产生错误:
编译器报告错误如下:
我们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值是:
下面考虑一下AllowMultiple = false。它规定了特性不能被重复放置多次。
它产生了一个编译期错误。
Ok,现在我们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。
C# AttributeUsage的使用会有四种可能的组合:
C# AttributeUsage的使用第一种情况:
如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。
C# AttributeUsage的使用第二种情况:
和第一种情况相同,因为inherited也被设置为false。
C# AttributeUsage的使用第三种情况:
为了解释第三种和第四种情况,我们先来给派生类添加点代码:
现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。
C# AttributeUsage的使用第四种情况:
在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。
C# AttributeUsage的相关内容就向你介绍到这里,希望对你了解和掌握C# AttributeUsage的使用有所帮助。
AttributeUsage
【AttributeUsage】
System.AttributeUsage声明一个Attribute的使用范围与使用原则。
http://blog.csdn.net/nndtdx/article/details/6905802 http://www.cnblogs.com/luckdv/articles/Atrribute.html#3321438 http://www.cnblogs.com/kai364/p/4417436.html http://www.cnblogs.com/mahaisong/category/326195.html http://www.cnblogs.com/fenrir/archive/2008/09/08/1286388.html http://blog.csdn.net/yuwuji/article/details/6958304 http://www.cnblogs.com/ghfsusan/archive/2009/07/15/1524192.html(比较好的介绍) http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html http://blog.csdn.net/pan_junbiao/article/details/8461703 http://www.runoob.com/csharp/csharp-attribute.html http://www.cnblogs.com/xugang/archive/2011/01/06/1927619.html
C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用。其实AttributeUsage类就是描述了一个定制特性如和被使用。
C# AttributeUsage的使用要明白:
AttributeUsage有三个属性,我们可以把它放置在定制属性前面。第一个属性是:
◆ValidOn
通过这个属性,我们能够定义定制特性应该在何种程序实体前放置。一个属性可以被放置的所有程序实体在AttributeTargets enumerator中列出。通过OR操作我们可以把若干个AttributeTargets值组合起来。
◆AllowMultiple
这个属性标记了我们的定制特性能否被重复放置在同一个程序实体前多次。
◆Inherited
我们可以使用这个属性来控制定制特性的继承规则。它标记了我们的特性能否被继承。
C# AttributeUsage的使用实例:
下面让我们来做一些实际的东西。我们将会在刚才的Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。
using System; [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 on this 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("this is a do-nothing class")] [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 { }
C# AttributeUsage的使用会有四种可能的组合:
[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 ]
C# AttributeUsage的使用第一种情况:
如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。
C# AttributeUsage的使用第二种情况:
和第一种情况相同,因为inherited也被设置为false。
C# AttributeUsage的使用第三种情况:
为了解释第三种和第四种情况,我们先来给派生类添加点代码:
[Help("BaseClass")] public class Base { } [Help("DeriveClass")] public class Derive : Base { }
现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。
C# AttributeUsage的使用第四种情况:
在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。
C# AttributeUsage的相关内容就向你介绍到这里,希望对你了解和掌握C# AttributeUsage的使用有所帮助。
AttributeUsage
【AttributeUsage】
System.AttributeUsage声明一个Attribute的使用范围与使用原则。
[AttributeUsage(AttributeTargets.Class)] public class VersionAttribute : Attribute { public string Name { get; set; } public string Date { get; set; } public string Describtion { get; set; } } [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")] public class MyCode { //... } class Program { static void Main(string[] args) { var info = typeof(MyCode); var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute)); Console.WriteLine(classAttribute.Name); Console.WriteLine(classAttribute.Date); Console.WriteLine(classAttribute.Describtion); } }
相关文章推荐
- C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”
- C#:办公用品管理软件项目总结
- [C#]UDP通讯
- C# WinForm开发系列 - DataGridView 使用方法集锦
- C#基本功------委托和事件(二)--拉姆达表达式
- C#或者WPF中让某个窗体置顶
- C#中Winform动态调用Webservice的方法(转)
- 【C#】打印控件中的内容和打印窗体中的内容
- 静态方法输出参数统计大写字母、小写字母、数字、其他字符的个数
- C# DataTable的详细用法
- 几种C#程序读取MAC地址的方法
- C#中的匿名函数
- C# 写的32位COM组件,如何在64位系统上注册
- C# Window编程随记——C#反射技术的简单操作(读取和设置类的属性)
- C# WinForm国际化实现的简单方法
- C# 委托 线程 窗体假死
- C# IList集合扩展方法 -- 集合排序
- C#实现获取连续日期的问题
- c# winform 点菜宝接口demo程序
- C# Unicode编码与解码方法