码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-08 12:55:55      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

在.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.Reflection;

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");

            //获取类的类型,命名空间+类名
            var type = asmLoad.GetType("RefDll.Student");

            //创建类的实例,命名空间+类名
            var instance = asmLoad.CreateInstance("RefDll.Student");

            //设置实例中某一属性的值
            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.

 

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

标签:

原文地址:http://www.cnblogs.com/zhuyongblogs/p/5748638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!