zoukankan      html  css  js  c++  java
  • C#动态方法调用

    此篇将介绍C#如何在运行时动态调用方法。当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的。此篇则给你一把利剑,让动态对象的方法调用成为可能。

    1.动态调用dll里的方法:

    <span style="font-family:SimSun;font-size:12px;">/// <summary>
    /// 该类将被独立编入Class1.dll汇编
    /// </summary>
    class Class1
    {
        public static string method1()
        {
            return "I am Static method (method1) in class1";
        }
        public string method2()
        {
            return "I am a Instance Method (method2) in Class1";
        }
        public string method3(string s)
        {
            return "Hello " + s;
        }
    }
     
    /// <summary>
    /// 该类独立放入Test.exe汇编
    /// </summary>
    class DynamicInvoke
    {
        public static void Main(string[] args)
        {
            // 动态加载汇编
            string path = "Class1.dll";
            Assembly assembly = Assembly.Load(path);
     
            // 根据类型名得到Type
            Type type = assembly.GetType("Class1");
     
            // 1.根据方法名动态调用静态方法
            string str = (string)type.InvokeMember("method1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] { });
            Console.WriteLine(str);
     
            // 2.根据方法名动态调用动态对象的成员方法
            object o = Activator.CreateInstance(type);
            str = (string)type.InvokeMember("method2", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { });
            Console.WriteLine(str);
     
            // 3.根据方法名动态调用动态对象的有参成员方法
            object[] par = new object[] { "kunal" };
            str = (string)type.InvokeMember("method3", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, par);
            Console.WriteLine(str);
     
            // 带out修饰的InvokeMember
            // System.Int32 中 public static bool TryParse(string s, out int result) 方法的调用
            var arguments = new object[] { str, null }; // 注意这里只能将参数写在外面,out参数为null也没有关系
            typeof(int).InvokeMember("TryParse", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static,
                 null, null, arguments);
            Console.WriteLine(arguments[1]);
        }
    }</span>
    View Code


    2.动态加载类文件并调用方法: 

    using System;
    using System.CodeDom.Compiler;
    using System.IO;
    using System.Reflection;
    using System.Threading;
    using System.Windows.Forms;
    using Microsoft.CSharp;
     
    namespace _32.DynamicReflection
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                #region 内置标签方法 (动态加载)
     
                const string className = "DynamicReflection.Test"; //类名称一定要全称
                string fileName = <strong>Thread.GetDomain().BaseDirectory + "Test.cs";</strong>
     
                if (File.Exists(fileName))
                {
                    var sourceFile = new FileInfo(fileName);
                    CodeDomProvider provider = new CSharpCodeProvider();
                    var cp = new CompilerParameters();
                    cp.ReferencedAssemblies.Add("System.dll"); //添加命名空间引用 
     
                    cp.GenerateExecutable = false; // 生成类库
                    cp.GenerateInMemory = true; // 保存到内存
                    cp.TreatWarningsAsErrors = false; // 不将编译警告作为错误
     
                    // 编译
                    CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile.FullName);
                    if (cr.Errors.Count < 1)
                    {
                        Assembly asm = cr.CompiledAssembly; // 加载
     
                        //1.调用静态方法
                        Type type = asm.GetType(className);
                        var str =(string)type.InvokeMember("SayHello1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] {});
                        Console.WriteLine(str);
     
                        //2.调用实例方法
                        object instance = asm.CreateInstance(className);
                        str =(string)type.InvokeMember("SayHello2", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,new object[] {});
                        Console.WriteLine(str);
     
                        //3.调用带参数的方法
                        var par = new object[] {"zhangqs008"};
                        str =(string)type.InvokeMember("SayHello3", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,par);
                        Console.WriteLine(str);
     
                        Console.Read();
                    }
                    else
                    {
                        string msg = null;
                        for (int index = 0; index < cr.Errors.Count; index++)
                        {
                            CompilerError error = cr.Errors[index];
                            msg += "【错误" + (index + 1) + "" + Environment.NewLine;
                            msg += "[文件] " + error.FileName + Environment.NewLine;
                            msg += "[位置] 行" + error.Line + ",列" + error.Column + Environment.NewLine;
                            msg += "[信息] " + error.ErrorText + Environment.NewLine;
                            msg += Environment.NewLine;
                        }
                        MessageBox.Show(msg, "内置方法类编译错误");
                    }
                }
     
                #endregion
            }
        }
    }

     

     

     

    类文件:

    DynamicReflection
    {
        public class Test
        {
            public static string SayHello1()
            {
                return "hello static method";
            }
     
            public string SayHello2()
            {
                return "hello instance method";
            }
     
            public string SayHello3(string args)
            {
                return "hello args " + args;
            }
        }
    }
  • 相关阅读:
    年年岁岁花相似,岁岁年年竟相同
    两情相悦,亦或情投意合
    FreeBSD学习笔记1
    MySQL学习笔记2
    门户网站镜像站以及CDN技术
    候车
    MySQL学习笔记1
    JDBC | 第一章: 快速开始使用JDBC连接Mysql数据库之简单CRUD
    JDBC | 第零章: 什么是JDBC?
    JDBC | 第二章: JDBC之批量更新,添加,和删除操作
  • 原文地址:https://www.cnblogs.com/blogs2014/p/10315864.html
Copyright © 2011-2022 走看看