.NET 反射技术传递参数实例
用反射用了很长一段时间了只知道它的大概用处、具有什么样的功能,最近仔细看了下反射方面的知识,顺便也实践了一把,如动态调用DLL、创建实例对象等。在调用反射对象中有参数的方法时遇到了点问题,不知道参数该如何传递进去。在网上搜了下传递参数的方法有很多,有通过构造函数传递,有用MethodInfo对象的Invoke方法传递,比较了下貌似用Invoke方法传递比较方便,下面就说说吧。
我的测试方法中有两个类库,一个是函数类库,另一个是执行输出的控制台程序。主要是用控制台程序采用反射技术调用函数类库中的方法,具体的说明请看代码中的注释。
以下是主要代码片段
static void Main(string[] args)
{
//此处用反射调用DLL文件,路径是我硬盘的路径
Assembly a = Assembly.LoadFrom("D:\\工作文件\\Code\\Code\\Function\\bin\\Debug\\Code.Function.dll");
Type[] tList = a.GetTypes();//获取该DLL程序集中定义的类或类型
if (tList != null)//如果不为空
{
foreach (Type tItem in tList)//遍历每一个类或类型
{
//获取类中的方法
MethodInfo[] methods = tItem.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public);
//在类中查找方法名为“Show”的方法。
MethodInfo mShow = findMethod(methods, "Show");
if (mShow != null)
{
//创建该类的实例
object instance = Activator.CreateInstance(tItem);
object[] parameters = new object[1];//定义参数类型
parameters[0] = (object)"aaa";//设置Show方法的参数值
Console.WriteLine(mShow.Invoke(instance, parameters));//打印Show方法的输出结果
}
}
}
Console.ReadLine();
}
{
//此处用反射调用DLL文件,路径是我硬盘的路径
Assembly a = Assembly.LoadFrom("D:\\工作文件\\Code\\Code\\Function\\bin\\Debug\\Code.Function.dll");
Type[] tList = a.GetTypes();//获取该DLL程序集中定义的类或类型
if (tList != null)//如果不为空
{
foreach (Type tItem in tList)//遍历每一个类或类型
{
//获取类中的方法
MethodInfo[] methods = tItem.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public);
//在类中查找方法名为“Show”的方法。
MethodInfo mShow = findMethod(methods, "Show");
if (mShow != null)
{
//创建该类的实例
object instance = Activator.CreateInstance(tItem);
object[] parameters = new object[1];//定义参数类型
parameters[0] = (object)"aaa";//设置Show方法的参数值
Console.WriteLine(mShow.Invoke(instance, parameters));//打印Show方法的输出结果
}
}
}
Console.ReadLine();
}
此处附上源代码(源代码是在VS 2008环境中写的) 点击下载

浙公网安备 33010602011771号