C#特性与反射机制
来源:互联网 发布:天下三捏脸数据男贴吧 编辑:程序博客网 时间:2024/06/06 17:57
C#特性与反射机制
大纲
- 特性
- 预定义特性
- AttributeUsage
- Conditional
- Obsolete
- 自定义特性
- 反射机制
特性
什么是特性?
特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
特性的语法
[attribute(positional_parameters, name_parameter = value, ...)]element
特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。positional_parameters
规定必需的信息,name_parameter
规定可选的信息。
预定义特性
AttributeUsage
预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。
语法
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited)]
其中,
- 参数
validon
规定特性可被放置的语言元素。它是枚举器AttributeTargets
的值的组合。默认值是AttributeTargets.All
。 - 参数
allowmultiple
(可选的)为该特性的AllowMultiple
属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。 - 参数
inherited
(可选的)为该特性的Inherited
属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。
例如,
[AttributeUsage(AttributeTargets.Class)]class SthAttribute: Attribute{} //自定义特性
Conditional
这个预定义特性标记了一个条件方法,其执行依赖于它顶的预处理标识符。
语法
[Conditional( conditionalSymbol)]
Obsolete
这个预定义特性标记了一个条件方法,其执行依赖于它顶的预处理标识符。
语法
[Obsolete( message)][Obsolete( message, iserror)]
其中,
- 参数 message
,是一个字符串,描述项目为什么过时的原因以及该替代使用什么。
- 参数 iserror
,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。
创建自定义特性
创建并使用自定义特性包含四个步骤:
- 声明自定义特性
- 构建自定义特性
- 在目标程序元素上应用自定义特性
- 通过反射访问特性
声明自定义特性例子,
public class TableAttribute: Attribute{} //特性必须是Attribute的派生类
构建自定义特性例子,
public class TableAttribute: Attribute{ public string TableName{ get; set; } ...}
在目标程序元素上应用自定义特性例子,
[TableAttribute(TableName="department")]public class Department{ //...}
通过反射访问特性
例子,
var obj = new Department();#region process...#endregionvar ta = Attribute.GetCustomAttribute(obj.GetType(), typeof(TableAttribute)) as TableAttribute;
反射机制
什么是反射?
反射(Reflection) 对象用于在运行时获取类型信息。
反射(Reflection)有下列用途:
- 它允许在运行时查看属性(attribute)信息。
- 它允许审查集合中的各种类型,以及实例化这些类型。
- 它允许延迟绑定的方法和属性(property)。
- 它允许在运行时创建新类型,然后使用这些类型执行一些任务。
查看属性
NewClassw nc = new NewClassw();Type t = nc.GetType();// get the public propertiesPropertyInfo[] pis = t.GetProperties();foreach(PropertyInfo pi in pis){ Console.WriteLine(pi.Name); //output the public property name}// get the public methodsMethodInfo[] mis = t.GetMethods();foreach (MethodInfo mi in mis){ Console.WriteLine(mi.ReturnType+" "+mi.Name);}
实例化
NewClassw nc = new NewClassw();Type t = nc.GetType();object obj = Activator.CreateInstance(t);//取得ID字段FieldInfo fi = t.GetField("ID");//给ID字段赋值fi.SetValue(obj, "k001");//取得MyName属性PropertyInfo pi1 = t.GetProperty("MyName");//给MyName属性赋值pi1.SetValue(obj, "grayworm", null);PropertyInfo pi2 = t.GetProperty("MyInfo");pi2.SetValue(obj, "hi.baidu.com/grayworm", null);//取得show方法MethodInfo mi = t.GetMethod("show");//调用show方法mi.Invoke(obj, null);
延迟绑定的方法和属性
Student nc = new Student();Type t= nc.GetType();//获取NewClass所有属性PropertyInfo[] pis = t.GetProperties();//从数据库中获取Student表DataTable dt = SqlHelper.ExecuteDataTable("SELECT * FROM Student WHERE ID=@ID", new SqlParameter("@ID", studentID));foreach(PropertyInfo pi in pis){ pi.SetValue(nc,pi.Name,dt.rows[0][pi.Name])}
相关链接:
特性参考链接
- C# 特性(Attribute)
- C# 特性(Attribute)详细介绍
- C#特性详解
反射机制参考链接
- 详解C#中的反射
- C# 反射(Reflection)
0 0
- C#特性与反射机制
- C#属性与特性,方法,反射
- C# 编程中的反射机制与方法
- C#反射机制概述与应用
- C#反射的特性
- C#反射和特性
- c# 反射和特性
- C# 特性和反射
- C#特性和反射
- c#关于反射与特性《一》---动态调用成员
- C#特性与反射:从XML文件创建对象
- 学习反射机制 c#
- C#反射机制
- C#反射机制
- C#的反射机制
- C#的反射机制
- c#中的反射机制
- 学习 c# 反射机制
- 解决ScrollView嵌套ListView问题 ListView只显示一行问题
- 最左侧1问题
- windows下安装php的redis扩展
- GreenDao的使用心得
- Java内部类分类
- C#特性与反射机制
- Linux命名cat grep查看日志
- 对象(DuoTaiDemo1)
- 笔记二 opencv2 学习规划
- Android之Notification的多种用法
- HTML中让表单input等文本框为只读不可编辑的方法
- 《Effective C++》42: 了解 typename 的双重意义
- Objective-C Runtime 一小时入门教程(上)
- poj1502 MPI Maelstrom(dijkstra模板)个人理解