C# 特性和反射
特性的概念
特性是一种允许我们向程序的程序集增加元数据的语言结构,他是用于保存程序结构信息的某种特殊类型的类。
将应用了特性的程序结构叫做目标
设计用来获取和使用元数据的程序叫做特性的消费者
.NET预定了很多特性,我们也可以声明自定义特性
什么是元数据?什么是反射?
1、程序是用来处理数据的,文本和特性都是数据,而我们程序的本身也是数据
2、有关程序及其类型的数据被称为元数据,他们保存在程序的程序集中
3、程序在运行时可以查看其他程序集或其本身的元数据,一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射
Type类
Type位于Syatem.Reflection命名空间下
预定义类型(int和long、string等 ),BCL的类型(Console,IEnumerable等)
Type类是抽象类,不能实例化对象
注意事项:
对于程序中用到的每一个类型,CLR都会创建包含这个类型信息的Type类型的对象程序中用到的每一个类型都会关联到每一个独立的Type类的对象
不管创建的对象有多少个实例,只有一个Type对象会关联到所有的这些实例
获取Type对象
1、Type t=myInstance.GetType();通过类的实例来获取Type对象
在object类有一个GetType方法,返回Type对象,所有的Type类都是从Object类继承的,所以我们可以在任何类型上使用GetType()来获取他的Type对象
2、Type t=typeof(直接通过typeof运算符和类名获取Type对象)
总结:通过Type对象可以获取它对应的类的所有公有的成员成员
首先创建一个MyCliass类
class MyClass
{
private int id;
public int age;
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public void Text1()
{
}
public string Text2()
{
return "你好";
}
}
在主函数中通过Type对象获取类中的成员
static void Main(string[] args)
{
//每一个类对应一个type对象,这个type对象存储了这个类的方法、数据和成员
MyClass my = new MyClass();//一个类中的具体的数据是存储在对象中的,但type对象只存储类的成员
Type type = my.GetType();//通过对象获取这个对象所属类的type对象
Console.WriteLine(type.Name);//类名
Console.WriteLine(type.Namespace);//命名空间
Console.WriteLine(type.Assembly);//获取对象所在的程序集
FieldInfo[] array = type.GetFields();//获取类中所有公有的字段
foreach (FieldInfo temp in array)
{
Console.Write(temp.Name + " ");
}
PropertyInfo[] array2 = type.GetProperties();
foreach (PropertyInfo info in array2)
{
Console.Write(info.Name + " ");//获取类中所有属性
}
MethodInfo[] array3 = type.GetMethods();
foreach (MethodInfo info in array3)
{
Console.Write(info.Name + " ");
//获取类中所有方法和跟类相关联的类中的所有方法
}
Console.ReadKey();
}
Assembly类
Assembly类在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,它也包含了可以加载和执行程序集
如何加载程序集
1、Assembly assembly1=Assembly.Load(“SomeAssembly”);根据程序集名字加载程序集,它会在本地目录,和全局程序集缓存目录查找符合名字的程序集
2、Assembly assembly2=Assembly.LoadFrom(@”c:\xx\xxSomeAssembly.dll”)这里的参数是程序集的完整路径名,他不会在其他位置搜索
Obsolete特性
Obsolete特性简单来讲就是当一些旧的方法已经过时的时候,提示程序猿使用新方法替代旧方法,但是旧方法仍然可以使用
class Program
{
[Obsolete("这个方法过时了,请使用NewMethod()代替")]//该特性表示一个方法被弃用了,但是仍然可以被使用
static void OldMethod()
{ }
static void NewMethod()
{
Console.WriteLine("新方法");
}
static void Main(string[] args)
{
OldMethod();
Console.ReadKey();
}
//当光标移动到被调用的旧方法上的时候,系统就会提示旧方法已经过时
class Program
{
[Obsolete("这个方法过时了,请使用NewMethod()代替", true)]//该特性表示一个方法被弃用了,但是仍然可以被使用
//bool值参数表示是否能调用旧方法,true时不能调用,系统会报错
static void OldMethod()
{
Console.WriteLine("旧方法");
}
static void NewMethod()
{
Console.WriteLine("新方法");
}
static void Main(string[] args)
{
OldMethod();
Console.ReadKey();
}
}
相关文章
- C# 如何提取字符串中的数字(小技巧)
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
- [C#基础]c#中的BeginInvoke和EndEndInvoke
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
- C# vs Java
- Word处理控件Aspose.Words功能演示:使用 C# ASP.NET 合并 MS Word 文档
- C#,布尔表达式括号问题(Boolean Parenthesization Problem)的求解算法与源代码
- 《C#多线程编程实战(原书第2版)》——2.3 使用Mutex类
- C# 窗口背景 短消息提示
- C#使用反射加载多个程序集
- C# Meta Programming - Let Your Code Generate Code - 利用反射重写自动的ToString()
- C#-遍历datatable的几种方法
- c# 反射
- 了解 C# 中的类和对象
- 《C#零基础入门之百识百例》(五十)嵌套类和嵌套方法 -- 汉诺塔游戏
- 《C#零基础入门之百识百例》(一百)反射详解 -- 检索特性
- C# 依赖注入中的 控制反转(Assembly)实现
- C#-通过反射对可空类型动态赋值的问题
- C# 反射赋值