plm007

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对

象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例。

 

/// <summary>

/// 这里是首先用Assembly来load一个程序集,而这个程序集是我自己已经写好的MyMath类库,里面有

/// +,-,*./,&,|,这六种操作,其中加减乘除是static类型的,而与或是非静态的类型

/// 这里的Assembly类是一个抽象类,所以没有办法来new出来,只有通过loadfile来建立

/// 加载完成之后,再找到对应的命名空间+类,再根据这个类来找到相应的方法

/// </summary>

static void AbTest()
{
//这理就是Assembly类来进行加载程序集,由于在字符串理有\,所以这个应该写为\\,或者是在前面加一个@来表示后面的全部是一个unicode字符
//最后就是方法调用,方法调用要求传入方法的参数,和对象的实例,如果这个方法是static类型的,不需要传入对象的实例
//首先是初始化方法要调用的参数列表,如果这个方法没有参数,则这一步可以省略为null类型
Assembly ass = Assembly.LoadFile(@"D:\MyMath.dll");
//找到相应的命名空间+类

//顺便提一下,这个Type也是抽象的,不能new出来,能通过GetType和typeof来实现
Type type = ass.GetType("MyMath.Operate");
//接下来就是利用MethodInfo来得到方法
MethodInfo method = type.GetMethod("Add");

object[] parameters = new object[2];
parameters[0] = 1; parameters[1] = 2;
Object obj = ass.CreateInstance("MyMath.Operate");

int result = (int)method.Invoke(obj, parameters);

Console.WriteLine("the add result is {0}", result);

Type[] typs =new Type[2];
typs[0]=Type.GetType("System.String");
typs[1] = Type.GetType("System.String");
object[] strs = new object[2];
strs[0] = "a"; strs[1] = "b";

string str=(String)type.GetMethod("And", typs).Invoke(null, strs);
//传入参数列表和调用的对象

Console.WriteLine("the and result is {0}", result);

}

 

posted on 2018-09-11 22:53  plm007  阅读(59)  评论(0)    收藏  举报