zoukankan      html  css  js  c++  java
  • 利用反射动态创建实例并调用方法

    在.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:UserslenovoDesktopDllSolutionRefDllinDebugRefDll.dll");
    
                //3、这个方法也可以,参数同样是dll路径
                //var asmLoad = Assembly.LoadFrom(@"C:UserslenovoDesktopDllSolutionRefDllinDebugRefDll.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.

  • 相关阅读:
    迭代器、生成器、装饰器(转)
    Python小数据池
    接阿里云oss有感
    VSCode快捷键
    前端跨域调请求 nginx反向代理
    Git生成密钥
    【westorm系列之二】配置格式化
    钉钉安卓端无法渲染数据
    express 写接口
    js正则匹配身份证号 有坑
  • 原文地址:https://www.cnblogs.com/zhuyongblogs/p/5748638.html
Copyright © 2011-2022 走看看