利用反射动态创建实例并调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例。

主要用途:

  1. 动态加载DLL,实现插件机制。
  2. 实例化DLL中的类型。
  3. 执行后期绑定,访问在运行时创建的类型的方法。

首先,新建一个空白解决方案:DllSolution

向解决方案中添加一个类库:RefDll,这将是需要被动态创建的程序集

重命名默认新建的Class1类:Student,这个类将是需要动态创建的类。有一个Name属性和一个SayHello方法

namespace RefDll
{
    public class Student
    {
        public string Name { get; set; }

        public void SayHello(string content)
        {
            Console.WriteLine(string.Format("{0} say {1} to everybody.", Name, content));
        }
    }
}

再向解决方案中添加一个控制台项目:ConsoleApplication,设为启动项

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、该方法传入的是Dll的名字,该Dll必须引用
            //var asmLoad = Assembly.Load("RefDll");

            //2、这个LoadFile最方便,参数就是dll的路径
            var asmLoad = Assembly.LoadFile(@"C:\Users\lenovo\Desktop\DllSolution\RefDll\bin\Debug\RefDll.dll");

            //3、这个方法也可以,参数同样是dll路径
            //var asmLoad = Assembly.LoadFrom(@"C:\Users\lenovo\Desktop\DllSolution\RefDll\bin\Debug\RefDll.dll");




            //方法1
            ////获取类的类型,命名空间+类名
            //var type = asmLoad.GetType("RefDll.Student");
            ////创建类的实例,命名空间+类名
            //var instance = asmLoad.CreateInstance("RefDll.Student");

            //方法2
            //获取类的类型
            var type = asmLoad.GetTypes().ElementAt(0);
            //创建类的实例
            var instance = Activator.CreateInstance(type);



            
            //设置实例中某一属性的值
            type.GetProperty("Name").SetValue(instance, "zhangsan", null);

            //获取类中的方法
            var method = type.GetMethod("SayHello");

            //调用方法
            method.Invoke(instance, new object[] { "hello" });

            Console.Read();
        }
    }
}

结果:zhangsan say hello to everybody.

 

posted @ 2016-08-08 11:29  bky_xiaozhu  阅读(708)  评论(0编辑  收藏  举报