属性的调用:
例如:
Assembly assObj = Assembly.LoadFrom(@"F:\学习反射与特性.exe");
Type type = assObj.GetType("类名字符串"); //包含命名空间的类名
//根据type创建对象
Object obj = Activator.CreateInstance(type);
//获得属性
PropertyInfo prop = type.GetProperty("属性名称字符串");
prop.SetValue(obj, 100);//设置属性
//得到属性值
prop.GetValue(obj, null).ToString();
源代码:
实体类:
/***
*实体类:被分析的对象
*
*
*/
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);
}
private void DisplayPrivateMethod()
{
Console.WriteLine("Person类, 我是私有方法, 一般情况不可能调用");
}
}
}
主程序:
/***
*使用反射技术进行动态调用
*缺点:运行速度慢
*优点:可以使得类对象之间的调用关系在"运行期"进行低耦合调用
* 可以随着配置文件的改变进行改变
*
*
*
*
*/
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);
}
/// <summary>
/// 演示,调用带参方法
/// </summary>
public void Test2()
{
string strClassName = "Person"; //类的名称
string strMethodName = "Test2"; //方法的名称
//得到程序集对象
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);
//调用有参方法
object[] objArray = new object[1];
objArray[0] = "任向飞";
method.Invoke(obj, objArray);
}
/// <summary>
/// 方法重载调用,没有参数
/// </summary>
public void Test3()
{
string strClassName = "Person"; //类的名称
string strMethodName = "Test3"; //方法的名称
//得到程序集对象
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, new Type[0]);//Type[0]表示重载方法无参
//调用无参方法,null表示没有参数
method.Invoke(obj, null);
}
/// <summary>
/// 方法重载调用,有参数
/// </summary>
public void Test4()
{
string strClassName = "Person"; //类的名称
string strMethodName = "Test3"; //方法的名称
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\任向飞\CSharp\c#进阶刘国柱\IO序列化\测试文件夹\反射技术调用指定类无参方法.exe");
//得到Type
Type typeObj = assObj.GetType("反射技术调用指定类无参方法." + "Person");
//创建对象
Object obj = Activator.CreateInstance(typeObj);
//得到方法
Type[] typeArrayWithPara = { typeof(int) }; //确定方法重载中有参数
MethodInfo method = typeObj.GetMethod(strMethodName, typeArrayWithPara);//typeArrayWithPara表示有参数
//调用有参方法,
object[] objArray = new object[1];
objArray[0] = 8888;
method.Invoke(obj, objArray);
}
/// <summary>
/// 演示私有方法的调用DisplayPrivateMethod
/// </summary>
public void Test5()
{
string strClassName = "Person"; //类的名称
string strMethodName = "DisplayPrivateMethod"; //方法的名称
//得到程序集对象
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, BindingFlags.NonPublic|BindingFlags.Instance);
//调用无参方法,null表示方法没有参数
method.Invoke(obj, null);
}
/// <summary>
/// 演示属性的调用
/// </summary>
public void Test6()
{
string strClassName = "Person"; //类的名称
string strPropertyName = "ID"; //属性的名称
//得到程序集对象
Assembly assObj = Assembly.LoadFrom(@"E:\任向飞\CSharp\c#进阶刘国柱\IO序列化\测试文件夹\反射技术调用指定类无参方法.exe");
//得到Type
Type typeObj = assObj.GetType("反射技术调用指定类无参方法." + "Person");
//创建对象
Object obj = Activator.CreateInstance(typeObj);
//得到属性
PropertyInfo prop = typeObj.GetProperty(strPropertyName);
//设置属性
prop.SetValue(obj, 5000, null);
//属性执行
string strResult = prop.GetValue(obj, null).ToString();
Console.WriteLine(strResult);
}
static void Main(string[] args)
{
Program obj = new Program();
//obj.Test1();
//obj.Test2();
//obj.Test3();
//obj.Test4();
//obj.Test5();
obj.Test6();
}
}
}