前言

    获取方法的相关信息的两种形式

反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象;

在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式:

MethodInfo [] GetMethods()

MethodInfo [] GetMethods(BindingFlags bindingflas)  :它的参数带有一些限制 BindingFlags  是一个枚举

枚举成员 [DeclaredOnly,Instance ,Public]   枚举成员的功能使用  在编译器中使用"."符号后自己认真观察 【相信你很快能够理解】

ParameterInfo[]  GetParameters() 方法返回一个方法的参数列表

下面用到的类 MyClass ,为了方便阅读,我把它折叠了!

 class MyClass
{
int x;
int y;
public MyClass(int i, int j)
{
this.x = i;
this.y = j;
}
public int Sum()
{
return x + y;
}
public bool IsBetween(int i)
{
if (x < i && i < y)
{
return true;
}
return false;
}
public void Set(int a, int b)
{
x = a;
y = b;
}
public void Set(double a, double b)
{
x = (int)a;
y = (int)b;
}
public void Show()
{
Console.WriteLine("x: " + x + " y: " + y);
}
}

MyClass

Main:

  Type t = typeof(MyClass);//获得一个表示MyClass类的Type对象
Console.WriteLine("获取当前成员的名称" + t.Name);
Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
Console.WriteLine("支持的方法");
#region 第一种形式
//MethodInfo[] mi = t.GetMethods();//显示Class类中被支持的方法
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//方法GetMethods() 把 MyClass 的基类 object方法都显示出来了
//下面我们说说 GetMethods() 的另外一种形式,有限制的显示
#endregion
#region 第二种形式
MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
#endregion
foreach (MethodInfo m in mi)
{
//返回后打印出MyClass类中成员的类型(方法的返回值类型)极其方法名称
Console.Write(" " + m.ReturnType.Name + " " + m.Name + " (");//ReturnType获取此方法的返回类型
ParameterInfo[] pi = m.GetParameters();//获得方法的参数
for (int i = ; i < pi.Length; i++)
{
Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);//ParameterType 获取该参数的Type(类型)
if (i+<pi.Length)
{
Console.Write(", ");
} }
Console.WriteLine(")");
Console.WriteLine();
} Console.ReadKey();

    使用反射调用方法

上面 讨论了怎么获取一个类型所支持的方法,然而为我们获取对方法的调用做了充分的准备!

MethodInfo类中的Invoke() 方法提供了该技能!

它的一种形式:  object Invoke(object  obj,object [] paramenters)

obj 是一个对象引用,将调用它所指向的对象上的方法,对于static方法,obj必须为null。

所有需要传递给方法的参数都必须在parameters数组中指定。如果方法不需要参数,则paramenters必须为null

基类MethodBase的 Invoke()方法返回被调用方法的返回值

请看下面的事例:

MyClass类Set()方法有所改变:

  public void Set(int a, int b)
{
Console.WriteLine("Set(int,int)");
x = a;
y = b;
Show();
}
public void Set(double a, double b)
{
Console.WriteLine("Set(double,double)");
x = (int)a;
y = (int)b;
Show();
}

应用程序代码!

  Type t = typeof(MyClass);
MyClass reflectOb = new MyClass(, );
int val;
Console.WriteLine("Invoke methods in " + t.Name);//调用MyClass类的方法
Console.WriteLine();
MethodInfo[] mi = t.GetMethods(); foreach (MethodInfo m in mi)//调用每个方法
{
//获得方法参数
ParameterInfo[] pi = m.GetParameters();
if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[].ParameterType==typeof(int))
{
// 指定 System.String.Compare(System.String,System.String) 和 System.String.Equals(System.Object)
// 方法的某些重载要使用的区域、大小写和排序规则。
//StringComparison.Ordinal 使用序号排序规则比较字符串
object[] obj = new object[];
obj[] = ;
obj[] = ;
m.Invoke(reflectOb, obj);
}
else if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[].ParameterType==typeof(double))
{
object[] obj = new object[];
obj[] = 1.12;
obj[] = 23.4;
m.Invoke(reflectOb, obj);
}
else if (m.Name.Equals("Sum",StringComparison.Ordinal))
{
val = (int)m.Invoke(reflectOb, null);
Console.WriteLine("Sum is : " + val);
}
else if (m.Name.Equals("IsBetween", StringComparison.Ordinal))
{
object[] obj = new object[];
obj[] = ;
if ((bool)m.Invoke(reflectOb, obj))
{
Console.WriteLine("14 is between x and y");
}
}
else if (m.Name.Equals("Show",StringComparison.Ordinal))
{
m.Invoke(reflectOb,null);
}
}

Main

详细地址 :http://www.mhprofessional.com/product.php?cat=112&isbn=007174116X&cat=112

C#反射 入门学习 01的更多相关文章

  1. C#反射 入门学习 02

    获取Type类型的构造函数 前言                  有了前面的 C#反射 入门学习 01的知识,学习这篇估计是搓搓有余,它教会了我们获取方法的相关信息的两种形式与 使用反射调用方法,  ...

  2. Matlab2015入门学习01

    1. 两个命令: clear: 清除内存中变量的值(在workspace中可以看到) clc: 清除Command Window中的输出 2. 脚本编辑器: matlab脚本扩展名为*.m 在Comm ...

  3. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  4. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  5. 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习

    反射实现Model修改前后的内容对比   在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...

  6. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  7. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

  8. spring学习(01)之IOC

    spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...

  9. OpenGL入门学习(转载)

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

随机推荐

  1. linux6.2安装mysql

    今天安装了一天的mysql,刚开始没想到会这么长时间,也和自己的基础不好有关,现在来说一下我的安装过程. 先说环境:rhel6.2 mysql5.1 在linux中,可能默认已经安装了一个mysql- ...

  2. STL之string

    string构造函数,很多重载函数: #include <iostream> #include <string> using namespace std; int main() ...

  3. AIX LVM学习笔记

    LVM: LOGIC VOLUMN MANAGEMENT (逻辑卷管理器) 通过将数据在存储空间的 逻辑视图 与 实际的物理磁盘 之间进行映射,来控制磁盘资源.实现方式是在传统的物理设备驱动层之上加载 ...

  4. shell实例浅谈之六文件特定行打印的多种方法

    一.问题 Sed和AWK在处理文件方面有很强的优势,还有head和tail等文件处理工具的使用,grep也可实现文本的搜索.上述命令都可以在后面直接加文件名,不需要在前面使用cat添加管道,cat会影 ...

  5. r语言之散点图绘制及参数

    一个简单的例子: > plot(cars$dist~cars$speed,+ main="车位移与速度的关系",+ xlab="速度",+ ylab=&q ...

  6. 关于map

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对, ...

  7. RMAN多种备份脚本分享

    1.相关参数介绍: 命令行参数 描述 TARGET 为目标数据库定义的一个连接字符串,当连接到一个目标数据库时,该连续是SYSDBA连接.该用户拥有启动和关闭数据库的权利,必须属于OSDBA组,必须建 ...

  8. 1410 - Consistent Verdicts(规律)

    1410 - Consistent Verdicts   PDF (English) Statistics Forum Time Limit: 5 second(s) Memory Limit: 32 ...

  9. strut2服务器与android交互数据

    libs如图: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  10. svn恢复到之前某个版本号

    一直在找svn回滚的方法,这个还是非常有用的,屡试不爽阿 常常因为坑爹的需求,功能要切回到之前的某一个版本号.有两种方法能够实现: 方法1: 用svn merge  1) 先 svn up,保证更新到 ...