C# 特性AttributeUsage简介与使用教程
作者:wu.g.q 发布时间:2022-09-30 01:53:21
标签:C#,AttributeUsage
AttributeUsage
预定义特性AttributeUsage描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。
规定该特性的语法如下:
[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]
validon:自定义特性的对象,可以是类、方法、属性等对象(默认值是 AttributeTargets.All)
AllowMultiple:是否允许被多次使用(默认值为false:单用的)
Inherited:是否可被派生类继承(默认值为false:不能)
下面请看使用:
using System;
namespace AttributeUsagePractice
{
[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; }
}
}
class Program
{
[Help("this is a main class")]//error
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
含义为:定制特性类,不允许多次使用,不能被继承
第一个参数:
因为它的特性目标是 AttributeTargets.Class,而它放在函数前面,所以上面的程序会报错:特性“Help”对此声明类型无效。它只对“class”声明有效,正确的做法是放在 class Program 上面。
如果是下面的代码:
using System;
namespace AttributeUsagePractice
{
[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; }
}
}
[Help("this is a main class")]
[Help("this is a main2 class")]//error
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
第二个参数:
因为AllowMultiple = false,上面多次使用,所以报错 重复的“Help”特性,正确的做法就是去掉它
using System;
using System.Linq;
namespace AttributeUsagePractice
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{
public HelpAttribute(){}
public HelpAttribute(String Description_in)
{
this.description = Description_in;
}
protected String description;
public String Description
{
get { return this.description; }
}
}
[Help("this is a HelpAttribute use class")]
public class UseHelpAttribute
{
}
public class UseHelpAttributeDerive : UseHelpAttribute
{
}
class Program
{
public static void Main(string[] args)
{
// TODO: Implement Functionality Here
UseHelpAttributeDerive objHelpAttribute = new UseHelpAttributeDerive();
Type t = objHelpAttribute.GetType();
object [] objAttrs = t.GetCustomAttributes(typeof(HelpAttribute),true);
if(objAttrs!= null && objAttrs.Length > 0)
{
object temp = objAttrs.First();
HelpAttribute myAttr = temp as HelpAttribute;
Console.WriteLine("类描述:{0}", myAttr.Description);
}
else
{
Console.WriteLine("没有类描述");
}
Console.ReadKey(true);
}
}
}
第三个参数:
因为Inherited = false,所以运行结果为;
如果把Inherited = false 改为 Inherited = true,效果如下:
来源:https://www.cnblogs.com/wuguoqiang/p/15214208.html


猜你喜欢
- 本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下:CREATE PROCEDURE [dbo].[GetNameById
- 本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下:C#预处理器指令是在编译时调用的。预处理器指令(preproc
- 一、Nuget安装log4net --> Install-Package log4net二、在AssemblyInfo.cs文件中添加
- 1.launch启动协程fun main() = runBlocking { launch { &
- 当把一个事件发布到Spring提供的ApplicationContext中,被 * 侦测到,就会执行对应的处理方法。事件本身事件是一个自定义
- 一、问题由来项目开发中,由于实际需要将某一个功能模块抽取成了一个单独的服务,其他地方需要调用的时候,通过Spring提供的RestTempl
- 针对将特定端口加入到windows系统的防火墙中,使其允许或禁止通过防火墙。其大概思路是:/// <summary> /// 添
- 本文实例讲述了C#实现导出List数据到xml文件的方法。分享给大家供大家参考,具体如下:C#导出List数据到xml文件,这里主要用到的是
- 仿水波纹流球进度条控制器,Android实现高端大气的主流特效,供大家参考,具体内容如下效果图:CircleView这里主要是实现中心圆以及
- 本文解析了C# KeyUp事件中MessageBox的回车(Enter)键出现回调问题的解决办法。具体问题如下:在一个窗体上有一个名为txt
- 1. 概述定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。2. 模式
- 在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,如我们需要去初始化数据到redis缓存,或者启动后读取相应的字典配置等,这篇文章
- 目录IntroSampleWhat insideMoreReferenceIntroC# 9 中引入了 record,record 是一个特
- 背景笔者使用 Spring Security 5.8 时,发现网上很多教程所教的 Spring Security 配置类 SecurityC
- 本文实例讲述了Android控件之CheckBox、RadioButton用法。分享给大家供大家参考。具体如下:CheckBox和Radio
- 使用HTTPclient访问url获得数据最近项目上有个小功能需要调用第三方的http接口取数据,用到了HTTPclient,算是做个笔记吧
- C# 程序的通用结构C# 程序可由一个或多个文件组成。每个文件都可以包含零个或零个以上的命名空间。一个命名空间除了可包含其他命名空间外,还可
- 本文以一个简单的实例为大家介绍Android编程的入门知识,该案例是属于较早期的实例程序,读者可以对比学习,全面的了解Android程序的演
- CountDownLatch 是一个非常实用的多线程控制工具类。” Count Down ” 在英文中意为倒计数, Latch 为门问的意思
- 前言1.因为涉及到对象锁,Wait、Notify一定要在synchronized里面进行使用。2.Wait必须暂定当前正在执行的线程,并释放