前言

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

反射是一种允许用户获得类信息的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. SVN同步出现故障

    1.错误描写叙述    同步SVNStatusSubscribe时报告了错误,1中的0个资源已经同步    同步/frame时错误发生:Error getting status for resourc ...

  2. Zookeeper 在Hadoop中的应用

    Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...

  3. ccMacros

    #ifndef __CCMACROS_H__ #define __CCMACROS_H__ #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES #e ...

  4. PHP - 数组去重,(折中:符串去重)

    [译]更快的方式实现PHP数组去重 Jan 11, 2016 • Hector 原文:Faster Alternative to PHP’s Array Unique Function 概述 使用PH ...

  5. Axure使用

    (一)  Axure rp的界面 1-主菜单工具栏 大部分类似office软件,不做详细解释,鼠标移到按钮上都有对应的提示. 2-主操作界面 绘制产品原型的操作区域,所有的用到的元件都拖到该区域. 3 ...

  6. Longest Palindromic Substring - 一题多解

    题意是寻找一个字符串的最大回文字串,最简单的是n3方的算法,由于字符串最大长度为1000,所以这个方法很危险而且不科学. 紧接着想到的是一个n方的算法:回文子串是从中间向两边产生的,那么对于每个字符考 ...

  7. unix IO笔记

    一.IO与文件映射 1.IO的共享与效率 read与write其中数据缓冲的大小 读取数据的缓冲:getpagesize 2.定位与定位读取(随机读取) read与write在操作的时候,自动移动读取 ...

  8. 高级UNIX环境编程

    常规文件 只有索引节号(i-number,是一批i-node的索引),i-node不含文件名及数据字节,包括文件类型,链接数量,uid,gid,访问权限,字节数,最后访问时间,最后修改时间,信息节点最 ...

  9. Nginx+uwsgi+supervisor+Ubuntu+flask

    Nginx+uwsgi+supervisor+Ubuntu+flask Nginx+uwsgi+supervisor在Ubuntu上部署flask应用 网上找了许多讲关于Flask应用部署的文章几乎都 ...

  10. 通过原生js的ajax或jquery的ajax获取服务器的时间

    在实际的业务逻辑中,经常是与时间相关的,而前端能获得的时间有两个:客户端的时间,服务器的时间. 客户端时间通过 javascript中的Date对象可以获取,如 var dt = new Date() ...