(二)自定义特性

使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策。

1、编写自定义特性

定义一个FieldName特性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class FieldNameAttribute : Attribute
{private string name;public FieldNameAttribute(string name){this.name = name;}
}

(1)AttributeUsage特性

特性类本身用一个特性——System.AttributeUsage特性来标记。AttributeUsage第一个参数用于标识自定义特性可以应用到那些类型的程序元素上,其类型是枚举类型AttrubuteTargets。

当应用类型超过1个时,可以用OR运算符连接:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

AllowMultiple属性用于指定该特性是否可以多次应用于同一项上,当设置为false,以下编码会报错:
[FieldName("我的属性1")]
[FieldName("我的属性2")]
public int MyProperty { get; set; }

Inherited属性用于指示使用该特性的类或类成员能否由派生类或重写成员继承。

(2)指定特性参数

编译器会检查传递给特性的参数,并查找该特性中带这些参数的构造函数。一半仅提供一个构造函数,使用属性来定义任何其他可选参数。

(3)指定特性的可选参数

另一种语法,可把可选参数添加到特性中。这种语法指定可选参数的名称和值,它通过特性类中的公共属性或字段起作用。例如上述代码中AttributeUsage特性使用的AllowMultiple和Inherited就是使用的这种语法。

(三)反射

通过System.Type类可以访问关于任何数据类型的信息。System.Reflection.Assembly类可以用于访问给定程序集的相关信息,或者把这个程序集加载到程序中。

1、System.Type类

Type有与每种数据类型对应的派生类。获取指定任何给定类型的Type引用有3中常用方式:

使用C#的typeof运算符:

Type type = typeof(double);

使用GetType()方法(所有的类都会从System.Object继承这个方法):

double d = 10.0;
Type type = d.GetType();

使用Type类的静态方法GetType():

Type type = Type.GetType("System.Double");

(1)Type的属性

 1 class Program2 {3     static void Main(string[] args)4     {5         Type intType = typeof(int);6         Console.WriteLine("当前类型的类型名:"+intType.Name);7         Console.WriteLine("当前类型的类型完全限定名:" + intType.FullName);8         Console.WriteLine("当前类型的名称空间名:" + intType.Namespace);9         Console.WriteLine("当前类型的直接基类名:" + intType.BaseType);
10         Console.WriteLine("当前类型的.NET运行库中映射到的类型:" + intType.UnderlyingSystemType);
11         Console.WriteLine("是否为数组的:" + intType.IsArray);
12         Console.WriteLine("是否为值类型:" + intType.IsValueType);
13     }
14 }
15 public class MyBaseClass { }
16 public class MyClass : MyBaseClass { }

运行以上代码,结果如下:

还有很多IsXXX来判断是否为某种类型。

(2)方法

System.Type类的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方法和事件。后缀加‘s’的表示获取当前数据类型中所有的成员相关信息,不加则只获取数据类型中一个成员的相关信息。

Type intType = typeof(int);
var method = intType.GetMethod("GetHashCode");
var methods = intType.GetMethods();
foreach (var item in methods)
{}

System.Type类还包含有GetConstructor()方法和GetConstructors()等

转载于:https://www.cnblogs.com/sjqq/p/6776308.html

C#高级编程 第十五章 反射相关推荐

  1. [转]Windows Shell编程 第十五章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988016】...

    第十五章 SHELL扩展 谈到Windows Shell编程,Shell扩展是最重要的科目之一,绝大多数商业应用的最酷特征的都是通过Shell扩展实现的,而且有许多显著的系统特征实际都是插入了扩展代码 ...

  2. Windows Shell 扩展编程 第十五章

    转自:http://blog.csdn.net/chchzh/article/details/4597866 第十五章 SHELL扩展 谈到Windows Shell编程,Shell扩展是最重要的科目 ...

  3. Windows核心编程 第十五章 在应用程序中使用虚拟内存

    第1 5章 在应用程序中使用虚拟内存 Wi n d o w s提供了3种进行内存管理的方法,它们是: • 虚拟内存,最适合用来管理大型对象或结构数组. • 内存映射文件,最适合用来管理大型数据流(通常 ...

  4. c++面向对象高级编程 学习十五 组合继承关系下的构造和析构

    文章目录 继承关系 组合关系 继承和组合 继承关系 构造由内而外,析构由外而内,内即是父类 组合关系 A拥有B, 构造由内而外,析构由外而内,内即是B 继承和组合 构造和析构顺序如图:

  5. UNIX 环境高级编程总结——第五章 标准I/O 库

    5.1 流和 FILE 对象 对于标准 I/O 库,它们的操作则是围绕流(stream)进行的. 当打开一个流时,标准 I/O 函数 fopen 返回一个指向 FILE 对象的指针. 为了引用一个流, ...

  6. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常

    第二十五章  未处理异常,向量化异常处理与C++异常 本章内容 25.1 UnhandledExceptionFilter函数详解 25.2 即时调试 25.3 电子表格示例程序 25.4 向量化异常 ...

  7. 【正点原子Linux连载】第十五章点亮LED-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

  9. 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...

最新文章

  1. springboot集成swagger2测试接口
  2. 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
  3. javascript中使用重载
  4. c/c++在windows下获取时间和计算时间差的几种方法总结
  5. spring EL 实现ref的效果
  6. Sublime Text 3实用快捷键大全
  7. VS2003升级VS2010修改
  8. 如何迎接新的 .NET 时代
  9. hadoop hdfs空间满后重新启动不了
  10. bootstrap modal 关闭时右侧滚动条消失,页面左移的解决方法
  11. HTML标记特定,制作asp:标记特定的HTML标记
  12. 【组合数学】组合恒等式 ( 八个组合恒等式回顾 | 组合恒等式 积 1 | 证明 | 使用场景 | 求组合数通用方法 )
  13. MCMC算法学习总结
  14. 数据结构和算法知识点整理
  15. java分析内存泄露工具_AIL-Framework下载-java内存泄露分析工具(Information Analysis Leaks)-东坡下载...
  16. L298N模块的使用介绍
  17. Android 在mac上显示手机屏幕 MAC 投影 安卓手机
  18. Pytorch系列(六):猫狗大战3-MobileNet_V1V2
  19. Python笔记 之 interval模块
  20. 关于Proximal Methods,近端梯度下降的理解

热门文章

  1. 图解CSS中padding、margin、border的区别及使用
  2. [转]-Sublime Text 3最好的功能、插件和设置
  3. java中有效关键字_java中有效的关键字
  4. OpenSSL API: SSL对象和SSL_CTX对象的使用
  5. JavaWeb——springMVC请求数据绑定分类解析(深度好文)
  6. ArcGIS Maritime Server 开发教程(六)Maritime Service 开发技巧
  7. ArcGIS制图表达Representation-制图表达介绍
  8. 深入浅出Docker(六):像谷歌一样部署你的应用
  9. 使用NUnit进行DotNet程序测试
  10. 电路计算机辅助设计上海电力学院,上海电力学院电路计算机辅助设计1.doc