分享

反射用法总结(原)

 WindySky 2010-12-06

  反射用法总结(原) - kenchell - kenchell-mitchel的博客反射用法总结(原) - kenchell - kenchell-mitchel的博客

frm_Main.cs类

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Reflection;

using Common;

using Business;

 

namespace ReflecTionAssembly

{

    public partial class frm_Main : Form

    {

        public frm_Main()

        {

            InitializeComponent();

        }

 

        private void btnOpt_Click(object sender, EventArgs e)

        {

 

            #region 方法一

            //需要添加CConfigFile程序集引用,加载了程序集的反射调用方法一()

            Assembly asb = System.Reflection.Assembly.Load("CConfigFile");//加载程序集,需要程序集名称,通过添加引用,相当于告诉了要加载程序集的绝对路径

            Business.CFileSection cfs = asb.CreateInstance("Business.CFileSection") as Business.CFileSection;//创建实例,需要命名空间+类名   

            this.txtInfo.Text = cfs.GetMessage("zhuangyq", 1);

            #endregion

 

            #region 方法一()

            //需要添加CConfigFile程序集引用,加载了程序集的反射调用方法一

            Assembly asb = System.Reflection.Assembly.Load("CConfigFile");//加载程序集,需要程序集名称,通过添加引用,相当于告诉了要加载程序集的绝对路径

            IChange cfs = asb.CreateInstance("Business.CFileSection") as IChange;//创建实例,需要命名空间+类名

            //这里通过使用接口比上面通过使用继承该接口的类耦合度降了些

            this.txtInfo.Text = cfs.GetMessage("zhuangyq", 1);

            #endregion

 

 

            #region 方法二

            //无需添加CConfigFile程序集引用,加载了程序集的反射调用方法二  相对第一种耦合性有所降低

            Assembly asb = System.Reflection.Assembly.LoadFile(@"F:\WinTest\ReflecTionAssembly\CConfigFile\bin\Debug\CConfigFile.dll");//加载程序集

            IChange cfs = asb.CreateInstance("Business.CFileSection") as IChange;//创建实例,需要命名空间+类名

            this.txtInfo.Text = cfs.GetMessage("zhuangyq", 2);

            #endregion

 

 

            #region 方法三

            //无需添加CConfigFile程序集引用,加载了程序集的反射调用方法三 相对第二种耦合性又降低

            Assembly asb = System.Reflection.Assembly.LoadFrom(@"F:\WinTest\ReflecTionAssembly\CConfigFile\bin\Debug\CConfigFile.dll");

            object obj = asb.CreateInstance("Business.CFileSection");//创建实例,需要命名空间+类名       

 

            Type type = asb.GetType("Business.CFileSection");//使用反射的方式获取类型

            //还可以使用以下方法获取类型

            // Type type = obj.GetType(); //因为已经成功创建了对象实例

 

            System.Reflection.MethodInfo method = type.GetMethod("GetMessage", new Type[] { typeof(string), typeof(int) });

            this.txtInfo.Text = method.Invoke(obj, new object[] { "zhuangyq", 3 }) as string;

            #endregion

 

            #region 方法三()

            //加载了程序集的反射调用方法三 相对第二种耦合性又降低

            Assembly asb = System.Reflection.Assembly.LoadFile(@"F:\WinTest\ReflecTionAssembly\CConfigFile\bin\Debug\CConfigFile.dll");

 

            Type type = asb.GetType("Business.CFileSection");

 

            object obj = System.Activator.CreateInstance(type);

            System.Reflection.MethodInfo method = type.GetMethod("GetMessage", new Type[] { typeof(string), typeof(int) });

 

            this.txtInfo.Text = method.Invoke(obj, new object[] { "zhuangyq", 3 }) as string;

            #endregion

 

 

            #region test

            //以下用法会报错,typenull,即使添加了CConfigFile程序集引用也没用

            Type type = Type.GetType("Business.CFileSection");

            Business.CFileSection csf = System.Activator.CreateInstance(type) as Business.CFileSection;

            this.txtInfo.Text = csf.GetMessage("zhuangyq", 1);

 

 

            //把如上代码改为如下代码即可(正确)

            Assembly asb = System.Reflection.Assembly.Load("CConfigFile");

            Type type = asb.GetType("Business.CFileSection");

            Business.CFileSection csf = System.Activator.CreateInstance(type) as Business.CFileSection;

            this.txtInfo.Text = csf.GetMessage("zhuangyq", 1);

 

 

            //如下用法即使类不在ReflecTionAssembly程序集下也是正确,因为显示确认对象了(正确)

            Type type = typeof(Business.CFileSection);//能够正确获取类型

            Business.CFileSection csf2 = System.Activator.CreateInstance(type) as Business.CFileSection;

            this.txtInfo.Text = csf2.GetMessage("zhuangyq", 4);

            #endregion

 

 

            #region test1

            CServiceFile csf = new CServiceFile();

            this.txtInfo.Text = csf.GetFile("zhuangyq", 1);

            #endregion

 

            #region test2

            //同一程序集,且相同命名空间下类的测试(正确)

            Type type = Type.GetType("ReflecTionAssembly.CServiceFile");//如果是当前程序集的类,可以用Type.GetType("命名空间+类名")获取Type

            CServiceFile csf = System.Activator.CreateInstance(type) as CServiceFile;

            this.txtInfo.Text = csf.GetFile("zhuangyq", 4);

 

 

            //显示获取同一命名空间下的类

            Type type = typeof(CServiceFile);

            CServiceFile csf2 = System.Activator.CreateInstance(type) as CServiceFile;

            this.txtInfo.Text = csf2.GetFile("zhuangyq", 5);

 

 

            //以下这种方法虽然正确,但不可取

            CServiceFile csf = new CServiceFile();

            Type type = csf.GetType();

            CServiceFile csf2 = System.Activator.CreateInstance(type) as CServiceFile;

            this.txtInfo.Text = csf2.GetFile("zhuangyq", 7);

            #endregion

 

            #region test3

            //同一程序集,但不同命名空间下类的测试(正确)

            Type type = Type.GetType("ModelAssembly.CModel");//如果是当前程序集的类,可以用Type.GetType("命名空间+类名")获取Type

            object obj = System.Activator.CreateInstance(type);

            System.Reflection.MethodInfo method = type.GetMethod("GetFile", new Type[] { typeof(string), typeof(int) });

            this.txtInfo.Text = method.Invoke(obj, new object[] { "zhuangyq", 6 }) as string;

            #endregion

        }

    }

 

    public class CServiceFile

    {

        public CServiceFile()

        { }

        public string GetFile()

        {

            return "Hello World! 无参数";

        }

        public string GetFile(string Info)

        {

            return this.GetFile() + "1个参数:" + Info;

        }

        public string GetFile(string Info, int time)

        {

            return "Hello World!" + "2个参数:" + Info + "" + time;

        }

    }

}

 

CModel.cs 类  

说明:和frm_Main.cs同一程序集,但不同命名空间

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ModelAssembly

{

    class CModel

    {

        public string GetFile()

        {

            return "Hello World! 无参数";

        }

        public string GetFile(string Info)

        {

            return this.GetFile() + "1个参数:" + Info;

        }

 

        public string GetFile(string Info, int time)

        {

            return "Hello World!" + "2个参数:" + Info + "" + time;

        }

    }

}

 

 

Interface.cs 接口

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Common

{

    public interface IChange

    {

        string GetMessage();

        string GetMessage(string Info);

        string GetMessage(string Info, int time);

    }

 

}

 

CFileSection.cs 类

说明:程序集名称为CConfigFile,但是类的命名空间为:Business

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Common;

 

namespace Business

{

     public class CFileSection:IChange

    {

        public CFileSection()

        {

 

        }

        #region IChange 成员

        public string GetMessage()

        {

            return "Hello World! 无参数";

        }

        public string GetMessage(string Info)

        {

            return this.GetMessage() + "1个参数:" + Info;

        }

 

        public string GetMessage(string Info, int time)

        {

            return "Hello World!" + "2个参数:" + Info + "" + time;

        }    

        #endregion

    }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多