当前位置:编程学习 > C#/ASP.NET >>

高手来解答C#反射的问题

利用反射可获得方法的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【】.属性

上一个:C#连接SQL代码,求高手注释。
下一个:怎样用C#在控制台输出Windows命令的帮助信息

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,