C#将字符串反射成可执行语句

在项目中,我们时常遇到要将字符串转化为可执行语句的需求。我理解这种需求其实是隶属于面向对象-多态的思想。但是我百度上找了一圈竟发现没几个人能正确写出反射的具体代码。

下面我分享一下本人在自动报工项目中写得一些代码给大家参考:

using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

class Program
{
    static void Main()
    {
        // 要执行的代码字符串
        string code = @"
            using System;

            public class Calculator
            {
                public static double Calculate(double hours, double numberOfWorkers)
                {
                    return hours * numberOfWorkers;
                }
            }
        ";

        // 创建 CSharpCodeProvider 实例
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters();

        // 添加需要的程序集引用
        parameters.ReferencedAssemblies.Add("System.dll");

        // 编译代码字符串
        CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

        if (results.Errors.HasErrors)
        {
            Console.WriteLine("编译错误:");
            foreach (CompilerError error in results.Errors)
            {
                Console.WriteLine(error.ErrorText);
            }
        }
        else
        {
            // 获取编译后的程序集
            Assembly assembly = results.CompiledAssembly;

            // 通过反射获取 Calculator 类型和其方法
            Type calculatorType = assembly.GetType("Calculator");
            MethodInfo calculateMethod = calculatorType.GetMethod("Calculate");

            // 调用方法并输出结果
            double hours = 10;
            double numberOfWorkers = 5;
            object result = calculateMethod.Invoke(null, new object[] { hours, numberOfWorkers });
            Console.WriteLine($"计算结果:{result}");
        }

        Console.ReadLine();
    }
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值