高手来解答C#反射的问题
利用反射可获得方法的MethodBase,进而通过GetMethodBody方法获取方法体内局部变量信息,那么是否可以通过反射给方法体内局部变量赋值?
比如:方法内有一个DbCommand对象,通过反射给Connection或Transaction等属性赋值
如果可以该如何做?
补充:分不够可以加
追问:挺辛苦的
利用反射可获得方法的MethodBase,进而通过GetMethodBody方法获取方法体内局部变量信息,那么是否可以通过反射给方法体内局部变量赋值?
比如:方法内有一个DbCommand对象,通过反射给Connection或Transaction等属性赋值
如果可以该如何做?
补充:分不够可以加
追问:挺辛苦的
答案:下面应该是很详细的了,再加点分吧,写了一下子,把一些经常用的都做了个解释,不过一般都是写好的通用的方法来调用比较轻松,你把下面看懂了,基本就OK了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//1. 获取程序集
Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "ConsoleApplication2.exe");//获取程序集
//1.1 获取Person对象
object objPerson = assembly.CreateInstance("ConsoleApplication2.Person");//实例化该对象
Type typePerson = objPerson.GetType();//获取该对象的类型
//1.2 获取Sex枚举
object objSex = assembly.CreateInstance("ConsoleApplication2.Sex");
Type typeSex = objSex.GetType();
//1.3 获取Job对象
object objJob = assembly.CreateInstance("ConsoleApplication2.Job");
Type typeJob = objJob.GetType();//2. 属性赋值
//2.1 给Name赋值
PropertyInfo personNameProperty = typePerson.GetProperty("PersonName");
personNameProperty.SetValue(objPerson, "张三", null);//2.2 给PersonSex赋值
PropertyInfo personSexProperty = typePerson.GetProperty("PersonSex");
personSexProperty.SetValue(objPerson, Enum.Parse(typeSex, "Boy"), null);//2.3 给PersonJob赋值
PropertyInfo jobNameProperty = typeJob.GetProperty("JobName");
jobNameProperty.SetValue(objJob, "程序员", null);
PropertyInfo personJobProperty = typePerson.GetProperty("PersonJob");
personJobProperty.SetValue(objPerson, objJob, null);//3. 调用方法
MethodInfo showNameMethod = typePerson.GetMethod("ShowPersonName");
showNameMethod.Invoke(objPerson, null);
MethodInfo showJobMethod = typePerson.GetMethod("ShowJobName");
showJobMethod.Invoke(objPerson, new object[] { "测试参数信息" });Console.WriteLine();
Console.ReadLine();
}
}class Person
{
private string _personName;
private Sex _personSex;
private Job _personJob;public string PersonName
{
get { return _personName; }
set { _personName = value; }
}
public Sex PersonSex
{
get { return _personSex; }
set { _personSex = value; }
}
public Job PersonJob
{
get { return _personJob; }
set { _personJob = value; }
}public void ShowPersonName()
{
Console.WriteLine(this._personName);
}public void ShowJobName(string sTest)
{
Console.WriteLine(sTest);
Console.WriteLine(this._personJob.JobName);
}
}enum Sex
{
Boy, Girl
}class Job
{
private string _jobName;
public string JobName
{
get { return _jobName; }
set { _jobName = value; }
}
}
}通过C#反射,把C#程序反编译成的IL码,找到Connection相对应的IL码,通过修改IL码相应的值,再重新编译回去。
用assembly【】.属性