反射

放射是指在程序运行时动态的获取类的信息的机制,我们下面来看看C#中的反射。

Type

Type 为 System.Reflection 功能的根,也是访问元数据的主要方式。 使用 Type 的成员获取关于类型声明的信息,如构造函数、方法、字段、属性 (Property) 和类的事件,以及在其中部署该类的模块和程序集。

我们获取一个指定类型的Type有三种方法:

  1. 通过typeof直接获取;
  2. 通过调用GetType方法获取;
  3. 通过调用Type的静态方法GetType获取;

这三个方法都可以获取指定类型的Type对象,但是也有一点区别,具体可以参考下面两篇博客:

http://www.studyofnet.com/news/284.html

http://blog.csdn.net/letianok/article/details/7257117

下面我们来看一个例子:

 using System;

 namespace Study
{
class Program
{
static void Main(string[] args)
{
Type t1 = typeof(string);
Console.WriteLine(t1.FullName);
//System.String Type t2 = "hello type!".GetType();
Console.WriteLine(t2.FullName);
//System.String Type t3 = Type.GetType("System.String", false);
Console.WriteLine(t3.FullName);
//System.String Console.Read();
}
}
}

获取类的信息

我们可以通过Type类型获取到类的所有信息,比如我们要获取类的所有方法信息的话,可以使用下面的代码:

 using System;
using System.Reflection; namespace Study
{
class Program
{
static void Main(string[] args)
{
string str = "Hello Type!"; Type t = str.GetType();
//获取所有方法信息
MethodInfo[] methodInfos = t.GetMethods();
for (int i = ; i < methodInfos.Length; i++)
{
Console.WriteLine(methodInfos[i].Name);
}
//仅获取非静态的公共方法信息
methodInfos = t.GetMethods(BindingFlags.Instance | BindingFlags.Public);
for (int i = ; i < methodInfos.Length; i++)
{
Console.WriteLine(methodInfos[i].Name);
} Console.Read();
}
}
}

更多信息的获取方法可以参考帮助文档(https://msdn.microsoft.com/zh-cn/library/system.type(v=vs.110).aspx)。

调用指定的方法

下面我们看看如何获取一个类的指定方法并进行调用:

 using System;
using System.Reflection; namespace Study
{
class Program
{
static void Main(string[] args)
{
string str = "Hello Type!"; Type t = str.GetType();
//对于存在多个重载的方法需要指明参数的类型
MethodInfo method = t.GetMethod("Split", new []{typeof(char[])});
//调用方法
string[] strs = method.Invoke(str, new object[] {new[] {' '}}) as string[];
for (int i = ; i < strs.Length; i++)
{
Console.WriteLine(strs[i]);
} Console.Read();
}
}
}

Assembly

程序集可以看做一个或多个DLL或EXE文件的集合,可以通过程序集将重复的代码提取出来,可以重复使用。

我们首先创建一个类库项目,代码如下:

 namespace StudyLib
{
public class MyClass
{
public int Add(int a, int b)
{
return a + b;
} public int Add(int a, int b, int c)
{
return a + b + c;
}
}
}

然后点击菜单栏-》生成-》生成XXX,可以获得对应的DLL文件,接下来我们使用Assembly读取DLL并执行其中的方法:

 using System;
using System.Reflection; namespace Study
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom("E:\\study\\C#\\StudyLib\\StudyLib\\bin\\Debug\\StudyLib.dll"); //输出所有类型名称
Type[] types = assembly.GetTypes();
for (int i = ; i < types.Length; i++)
{
Console.WriteLine(types[i].FullName);
}
//StudyLib.MyClass //动态创建类并调用其中的方法
Type t = assembly.GetType("StudyLib.MyClass");
ConstructorInfo constructor = t.GetConstructor(Type.EmptyTypes);
Object myClass = constructor.Invoke(new object[]{}); MethodInfo method1 = t.GetMethod("Add", new[] {typeof (int), typeof (int)});
int result1 = (int)method1.Invoke(myClass, new object[] {, });
Console.WriteLine("第一个方法返回: " + result1);
//第一个方法返回: 223 MethodInfo method2 = t.GetMethod("Add", new[] { typeof(int), typeof(int), typeof(int)});
int result2 = (int)method2.Invoke(myClass, new object[] { , , });
Console.WriteLine("第二个方法返回: " + result2);
//第二个方法返回: 679 Console.Read();
}
}
}

C#学习笔记(十):反射的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  3. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  4. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  5. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  6. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  7. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  8. python3.4学习笔记(十) 常用操作符,条件分支和循环实例

    python3.4学习笔记(十) 常用操作符,条件分支和循环实例 #Pyhon常用操作符 c = d = 10 d /= 8 #3.x真正的除法 print(d) #1.25 c //= 8 #用两个 ...

  9. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  10. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

随机推荐

  1. error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC解决办法

    使用qtcreator加androidndk编译项目时报错: error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; r ...

  2. ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking # 说明: # 本文主要对TI的sdk中的s ...

  3. 基于ffmpeg的流媒体服务器

    OS:ubuntu 12.04ffmpeg:N-47141-g4063bb2x264:0.133.2334 a3ac64b目标:使用ffserver建立流媒体服务器使用ffmpeg对本地文件流化(x2 ...

  4. HWM的实验

    HWM是数据段中使用空间和未使用空间之间的界限,假如现有自由链表上的数据块不能满足需求,Oracle把HWM指向的数据块加入到自由链表上,HWM向前移动到下一个数据块.简单说,一个数据段中,HWM左边 ...

  5. 【有趣~】SFOJ-1711 Obey的恋爱、NYOJ-739 笨蛋难题

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  6. 如何使用 orachk 工具

    Oracle RAC 安装完毕后的健壮性是一个令人头疼的问题.之前Oracle为之专门推出了raccheck工具,确实方便了我们这些个苦逼的DBA.现在Oracle在raccheck的基础之上又推出了 ...

  7. CF 577B Modulo Sum

    题意:给一个长度为n的正整数序列,问能不能找到一个不连续的子序列的和可以被m整除. 解法:抽屉原理+dp.首先当m<n时一定是有答案的,因为根据抽屉原理,当得到这个序列的n个前缀和%m时,一定会 ...

  8. linux 命令——文件管理 cat

    一.介绍 cat 是一个文本文件查看和连接工具.从第一个字节开始正向查看文件的内容. 主要有三大功能: 1.一次显示整个文件.$ cat   filename ~,y6;e2.从键盘创建一个文件.$ ...

  9. 《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 && 简化字符串的translate方法的使用

    检查字符串中是否包含某字符集合中的字符  任务: 检查字符串中是否出现了某个字符集合中的字符 解决方案: 方案一: import itertools def containAny(seq,aset): ...

  10. angular form-data文件上传

    前言:很久没更新博客,最近公司pc端技术选型用angular,这几天就赶鸭子上架,硬着头皮直接上手angular.其中有许多小坑陆陆续续踩起走.今天就遇到一个比较常见的问题:图片上传. 主题:图片上传 ...