根据类名与方法名(字符串),动态调用
例如:
Assembly assObj = Assembly.LoadFrom(@"F\学习反射与特性.exe");
Type type = assobj.GetType("类名字符串"); //包含命名空间的类名
//根据Type创建对象
Object obj = Activator.CreateInstance(type);
//获得方法信息
MethodInfo method = type.GetMethod("方法名称字符串");
//调用无参方法
method.Invoke(obj, null);
动态调用技术
源代码:
测试类:
/***
*实体类:被分析的对象
*
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 反射技术调用指定类无参方法
{
public class Person
{
//字段
public string Name;
public int Age;
private int _ID;
//属性
public int ID
{
get { return _ID; }
set { _ID = value; }
}
//方法
public void DisplayID()
{
Console.WriteLine(ID);
}
public void DisplayName()
{
Console.WriteLine(Name);
}
public void DisplayAge()
{
Console.WriteLine(Age);
}
//调用方法测试
public void Test1()
{
Console.WriteLine("Person类 Test1 无参方法");
}
public void Test2(string str)
{
Console.WriteLine("Person类 Test2 有参方法, 参数 = " + str);
}
public void Test3()
{
Console.WriteLine("Person类 Test3 无参方法");
}
public void Test3(int num)
{
Console.WriteLine("Person类 Test3 有参方法, 参数 = " + num);
}
}
}
主程序:
/***
*使用反射技术进行动态调用
*缺点:运行速度慢
*优点:可以使得类对象之间的调用关系在"运行期"进行低耦合调用
* 可以随着配置文件的改变进行改变
*
*
*
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace 反射技术调用指定类无参方法
{
class Program
{
/// <summary>
/// 通过反射,调用方法与属性
/// </summary>
public void Test1()
{
string strClassName = "Person"; //类的名称
string strMethodName = "Test1"; //方法的名称
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\任向飞\CSharp\c#进阶刘国柱\IO序列化\测试文件夹\反射技术调用指定类无参方法.exe");
//得到Type
Type typeObj = assObj.GetType("反射技术调用指定类无参方法." + "Person");
//创建对象
Object obj = Activator.CreateInstance(typeObj);
//得到方法
MethodInfo method = typeObj.GetMethod(strMethodName);
//调用无参方法,null表示方法没有参数
method.Invoke(obj, null);
}
public void Test2()
{
}
public void Test3()
{
}
static void Main(string[] args)
{
Program obj = new Program();
obj.Test1();
}
}
}