请选择 进入手机版 | 继续访问电脑版
虚位以待    招租QQ:244594752    尺寸:960x60
加入我们,年会VIP只需139元,全站下载
查看: 118|回复: 0

C# 动态调用方法

[复制链接]

该用户从未签到

2160

主题

2192

帖子

7346

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7346
发表于 2018-5-1 17:37:42 | 显示全部楼层 |阅读模式
此篇将介绍C#如何在运行时动态调用方法。当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的。此篇则给你一把利剑,让动态对象的方法调用成为可能。

1.动态调用dll里的方法

[csharp] view plain copy

<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>  
2.动态加载类文件并调用方法:
[csharp] view plain copy

<span style="font-family:SimSun;font-size:12px;">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  
        }  
    }  
}</span>  
类文件:
[csharp] view plain copy

<span style="font-family:SimSun;font-size:12px;">namespace 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;  
        }  
    }  
}  
</span>  

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|妙想源码社区 积分提现

GMT+8, 2018-8-15 05:00 , Processed in 1.085716 second(s), 24 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表
 
FDGDF
客服QQ 妙想科技 244594752
【旺旺】 点击这里给我发消息
【邮箱】
244594752@qq.com
【地址】 湖南省常德市武陵区三姑巷77
【妙想科技】 【9188qhl.com】