(十二)反射与特性-自定义特性(2)

news/2024/3/4 9:30:52

一、自定义特性

特性是一种特殊的类。
要点:

  • 用户自定义的特性类叫作自定义特性。
  • 所有特性类都派生自 System.Attribute

1、声明自定义特性

声明:

public sealed class MyAttributeAttribute : System.Attribute
{
...
}

由于特性持有目标的信息,所有特性类的公有成员只能是:

  • 字段
  • 属性
  • 构造函数

2、使用特性的构造函数

构造函数的显式隐式声明定义,以及重载等等,规则跟其他类一样。

public MyAtrributeAttribute(string desc, string ver)
{
...
}

3、指定构造函数

[MyAttribute("Holds a value")]//使用一个字符串的构造函数
public int MyField;
[MyAttribute("Version 1.3", "Galen Daniel")]//使用两个字符串的构造函数
public void MyMethod()
{
...
}
//MyAttribute:特性类

特性构造函数要点:

  • 构造函数的实参必须是在编译时能确定值的常量表达式。
  • 如果构造函数没有参数,代码如下:
[MyAttr]
class SomeClass...
[MyAttr()]
class OtherClass...

4、使用构造函数

//命令语句
MyClass mc = new MyClass("Hello", 5);
//声明语句
[MyAttribute("Holds a value")]

特性类和其他类,比较构造函数的使用:

  • 命令语句的实际意义是:“在这里创建新的类。
  • 声明语句的意义是:“这个特性和这个目标相关联,如果需要构造特性,则使用这个构造函数。”

5、构造函数中的位置参数和命名参数

[MyAttribute("An excellent class", Reviewer="Amy McArthur",Ver="0.7.15.33")]
//位置参数:An excellent class
//命名参数:Reviewer="Amy McArthur"、Ver="0.7.15.33"

示例:

public sealed class MyAttributeAttribute : System.Attribute
{
public string Description;
public string Ver;
public string Reviewer;public MyAttributeAttribute(string desc)//一个形参
{
Description = desc;
}
}[MyAtrribute("An excellent class", Reviewer="Amy McArthur", Ver="7.15.33")]
class MyClass
{
...
}

二、限制特性的使用

AttributeUsage 特性: 用来限制将特性用在某个目标类型上。

如果希望自定义特性 MyAttribute 只能应用到方法上。

[AttributeUsage(AttributeTarget.Method)]
public sealed class MyAtrributeAttribute : System.Attribute
{
...
}

表-AttributeUsage 的公有属性

名字意义默认值
ValidOn保存能应用特性的目标类型的列表。构造函数的第一个参数必须是 AtrributeTargets 类型的枚举值
Inherited一个布尔值,它指示特性是否可被装饰类型的派生类所继承true
AllowMutiple一个布尔值,指示目标上是否可应用特性的多个实例的false

1、AtrributeUsage 的构造函数

AtrributeUsage 的构造函数接受单个位置参数,该参数指定了可使用特性的目标类型。它用这个参数来设置 ValidOn 属性,可接受的目标类型是 AttributeTargets 枚举的成员。

可用通过使用按位或运算符来组合使用类型。

[AttributeUsage(AttributeTarget.Method | AtrributeTarget.Constructor)]
public sealed class MyAttributeAttribute : System.Attribute
{
...
}

AttributeTargets 枚举的成员

AllAssemblyClassConstructor
DelegateEnumEventField
GenericParameterInterfaceMethodModule
ParameterPropertyReterunValueStruct
  • MyAttribute 只能应用到类上。
  • MyAttribute 不会被用用它的类的派生类所继承。
  • 不能在同一个目标上应用 MyAttribute 的多个实例。
[AttributeUsage(AttributeTarget.Class,Inherited = false,AllowMultiple = false)]
public sealed class MyAttribute : System.Attribute
{
...
}

三、自定义特性的最佳实践

1、自定义特性实践

建议自定义特性时:

  • 特性类应用表示目标结构的某种状态。
  • 如果特性需要某些字段,可以通过包含具有位置参数的构造函数来收集数据,可选字段可以用采用命名参数按需初始化。
  • 除了属性之外,不要实现公有方法或其他函数成员。
  • 为了更安全,把特性类声明为 sealed。
  • 在特性声明中使用 AttributeUsage 来显式指定特性目标组。
[AttributeUsage(AttributeTargets.Class)]
public sealed class ReviewCommentAtrribute : System.Attribute
{
public string Description {get; set;}
public string VersionNumber {get;set;}
public string ReviewrID {get;set;}public ReviewCommentAtrribute(string desc,string ver)
{
Description = desc;
VersionNumber = ver;
}
}

2、访问特性

使用 Type 对象来获取类型信息。Type 的两个方法:IsDefine 和 GetCustomAttributes。

1)使用 IsDefine 方法

可以使用 Type 对象 的 IsDefine 方法来检测某个特性是否应用到了某个类上。

[AttributeUsage(AttributeTargets.Class)]
public sealed class ReviewCommentAttribute : System.Attribute
{...}[ReviewComent("Check ite out","2.4")]
class MyClass{ }class Program
{
static void Main()
{
MyClass mc = new MyClass();
Type t = mc.GetType();
bool isDefined = t.IsDenfined(typeof(ReviewCommentAtrribute),false);if(isDefined)
{
Console.WriteLine($"ReviewComment is applied to type { t.Name }");
}
}
}

输出结果:

ReviewComment is applied tp type MyClass

2)使用 GetCustomAttributes 方法

Type 类的 GetCustomAttributes 方法返回用用到结构上的特性的数组。

  • 实际返回的对象时 object 数组,因此我们必须将它强制转换为相应的特性类型。
  • 布尔参数指定是否搜索继承树来查找特性。
object[] AttArr = t.GetCustomAttributes(false);
  • 调用 GetCustonnAttributes 方法后,每一个与目标相关联的特性的实例就会被创建。
    [AttributeUsage(AttributeTargets.Class)]public sealed class MyAtrributeAttribute : System.Attribute{public string Description { get; set; }public string VersionNumber { get; set; }public string ReviewerID { get; set; }public MyAtrributeAttribute(string desc, string ver){Description = desc;VersionNumber = ver;}}[MyAtrribute("Check it out","2.4")]class MyClass{ }class Program{static void Main(string[] args){Type t = typeof(MyClass);object[] AttArr = t.GetCustomAttributes(false);foreach(Attribute a in AttArr){MyAtrributeAttribute attr = a as MyAtrributeAttribute;if(null != attr){Console.WriteLine($"Decription   : { attr.Description }");Console.WriteLine($"Version Number   : { attr.VersionNumber }");Console.WriteLine($"Reviewer ID   : { attr.ReviewerID }");}}Console.ReadKey();}}

输出结果:

Decription : Check it out
Version Number : 2.4
Reviewer ID :


http://www.ppmy.cn/news/519383.html

相关文章

dvwa靶场通关(七)

第七关:SQL Injection(sql注入) low 我们输入 1,出现报错信息,根据报错信息可知,查询语句是单引号闭合的字符型 接着判断字段数 1 order by 3# 报错 1 order by 2# 正常 所以字段数就是2 利用联合查询爆出数据库名…

《医疗器械唯一标识系统规则》解读

一、什么是医疗器械唯一标识?   医疗器械唯一标识由产品标识和生产标识组成,产品标识是识别注册人/备案人、医疗器械型号规格和包装的唯一代码,是从数据库获取医疗器械相关信息的“关键字”,是唯一标识的必须部分;生…

医疗行业上云

目录 一、医疗云的发展环境二、趋势分析三、业务挑战四、行业大体痛点五、业务系统上云及合规框架(华为)六、AI药物研发框架(华为) 一、医疗云的发展环境 医疗信息化由三大模块构成:区域卫生信息化、医院信息化和基于…

2018年医疗人工智能技术与应用白皮书

前 言 2017 年医疗人工智能发展迅速,产业格局风起云涌。人工智能在医疗领域中的应用已非常广泛,包括医学影像、临床决策支持、语音识别、药物挖掘、健康管理、病理学等众多领域。人工智能技术呈现与医疗领域不断融合的趋势,其中数据资源、计…

springboot医疗管理系统毕业设计源码015221

目 录 摘要 1 绪论 1.1项目设计背景 1.2项目设计意义 1.3医疗管理系统设计目标 1.4系统开发技术的特色 4 1.5论文结构与章节安排 4 2 医疗管理系统分析 5 2.1 可行性分析 5 2.2 系统流程分析 6 2.2.1数据增加流程 7 2.3.2数据修改流程 7 2.3.3数据删除流程 8 2.3 系统功能…

NCU SEM 发文检索2014年

[1]冯宗品.基于SWOT法的民生银行投资价值分析[J].商,2014,09:292-293. [2]甘筱青,尤铭祥,胡凯.医保报销比例差距、患者行为选择与医疗费用的关系研究——基于三阶段动态博弈模型的分析[J].系统工程理论与实践,2014,11:2974-2983. 摘要:我国初步建立了覆盖全民的…

换帅半年,阿里健康扭亏为盈,医疗搜索成为互联网分级诊疗体系的发力点

关注ITValue,看企业级最新鲜、最价值报道!11月25日晚间,阿里健康信息技术有限公司(00241.HK,下称“阿里健康”)发布截止2020年9月30日止的2021财年中期业绩报告。 财报显示,阿里健康上半年营收达…

如何开发一套完整的医疗远程会诊系统方案

医疗远程会诊系统解决方案,利用物联网和远程通信等技术手段,实时将会诊室或手术室全景以及患者医疗数据或手术细节经由高速网络传输到会诊中心,由专家远程进行病情会诊以及手术指导,实现专家与病人、专家与医务人员之间异地“面对…

美国医院权威评估体系

虽然医疗质量与患者风险指标,以及就医满意度的结果可为患者和家庭评价医疗机构提供可供参考的硬性依据,但由于医疗系统非常复杂,医疗机构种类繁多,普通老百姓和家庭很难区分出不同医疗机构之间的差别,在选择就医时更多…

对YY/T 0287-2017 医疗器械 质量管理体系的一些学习

YY/T的YY是医疗字母首位,T是推荐 按照按照GB/T 1.1-2009规则起草 翻译参考的:ISO 13485:2016 0.0术语和定义 0.1 总则 规定了质量管理体系要求,涉及医疗器械生命周期的一个或多个阶段的组织能依此要求进行医疗器械的设计和开发、生产、贮存…

医疗物联网平台架构图

物联网,简称IoT,是未来智慧医疗的核心。按照面向服务的体系架构,医疗物联网被分为四层结构:感知层、网络层、平台层和应用层。 感知层,又被称为传感层,是物联网的基本特征,由包括RFID以及各种智能传感器在内…

智慧医疗、互联网医疗相关术语

智慧医疗、互联网医疗相关术语 医院信息系统(HIS) 全称Hospital Information System。 HIS是覆盖医院所有业务和业务全过程的信息管理系统。利用电子计算机和通讯设备,为医院所属各部门提供病人诊疗信息和行政管理信息的收集、存储、处理、…

关于镇江市大数据服务体系的对策和建议研究

摘要:大数据将逐渐成为现代社会基础设施的一部分, 就像公路、铁路、港口、水电和通信网络一样不可或缺。但就其价值特性而言, 大数据却和这些物理化的基础设施不同, 不会因人们的使用而折旧和贬值。鉴于此, 我们剖析了镇江市大数据服务体系发展现状及存在的问题, 并…

区块链医疗应用

医疗现状 医疗行业利用区块链技解决个人健康数据的安全性与共享、医疗数据信息孤岛、产品溯源等。提供了更有效维护、全量备份、信息安全的分布式记账技术,为医疗数据共享带来更好思路。区块链的特性确保系统的稳定性。 医疗行业的发展主要是全球人口数量增加以及…

医疗大数据 隐私保护_大数据环境中的医疗数据隐私保护

本文通过对当前医疗大数据的研讨和应用现状的分析,深入讨论了大数据应用中可能存在的隐私保护问题,在此基础上对现有的防护技能和手段进行梳理,希望可以找到大数据环境下对医疗隐私数据的保护方法。 随着大数据时代的来临,各行业和领域都起初涉及大数据。笔者所在的中南大学…

智慧医疗

 智慧医疗英文简称WIT120,是最近兴起的专有医疗名词,通过打造健康档案区域医疗信息平台,利用最先进的物联网技术,实现患者与医务人员、医疗机构、医疗设备之间的互动,逐步达到信息化。 简介 …

数据中台 第9章 数据服务体系建设,数据赋能

一、数据服务平台 9.1.1 定义与定位 数据服务就是把数据变为一种服务能力,通过数据服务让数据参与到业务之中,激活整个数据中台,这也是数据中台的价值所在。 数据服务是对数据进行计算逻辑的封装(过滤查询、多维分析和算法推理等计算逻辑),生成API服务,上层数据应用可以…

“互联网+”医疗服务

今年在市属三甲医院中至少建设一家互联网医院,建成5个以上市属专科远程会诊中心,建成一个综合性远程会诊中心,两个区县级远程会诊分中心;到2020年,在三级医疗机构全面开展“互联网”医疗服务,三级医疗机构预…

【软件体系结构】软件体系结构风格

软件体系结构风格 文章目录 软件体系结构风格1.软件体系结构定义2.常见软件体系结构风格2.1管道和过滤器2.2数据抽象和面向对象组织2.3基于事件的隐式调用2.4分层系统2.5仓库系统2.6C/S风格2.7B/S风格 3.总结 软件体系结构的学习第二篇,软件体系结构风格。 1.软件体…

智慧医疗整体解决方案

1 智慧医疗概念 智慧医疗是智慧城市的一个重要组成部分,是综合应用医疗物联网、数据融合传输交换、云计算、城域网等技术,通过信息技术将医疗基础设施与IT基础设施进行融合,以“医疗云数据中心”为核心,跨越原有医疗系统的时空限…
最新文章