在项目中,我们时常遇到要将字符串转化为可执行语句的需求。我理解这种需求其实是隶属于面向对象-多态的思想。但是我百度上找了一圈竟发现没几个人能正确写出反射的具体代码。
下面我分享一下本人在自动报工项目中写得一些代码给大家参考:
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();
}
}