c#动态编译执行对象方法示例 运用映射机制创建对象


在C#中,动态编译并执行对象的方法可以通过多种方式实现,其中一种常见的方法是使用`Roslyn`(Microsoft的.NET Compiler Platform)或`CSharpCodeProvider`类。不过,对于动态创建对象并执行其方法,我们通常会结合使用反射(Reflection)和动态类型(如`dynamic`)或代码DOM(Document Object Model)。

以下是一个示例,展示了如何使用`CSharpCodeProvider`来动态编译C#代码,并通过反射来创建对象和执行其方法。注意,这个示例不会直接创建对象方法的映射,但会展示如何动态编译和执行代码,这可以作为实现映射机制的基础。

首先,你需要添加对`System.CodeDom.Compiler`和`Microsoft.CSharp`的引用。


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

public class DynamicCompiler
{
    public void CompileAndExecute()
    {
        // C# 代码字符串,这里定义了一个类和方法
        string code = @"
using System;

public class MyDynamicClass
{
    public void MyMethod()
    {
        Console.WriteLine(""Hello from dynamic method!"");
    }
}
";

        // 使用CSharpCodeProvider编译代码
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters
        {
            GenerateExecutable = false,
            GenerateInMemory = true,
            ReferencedAssemblies = { "System.dll" }
        };

        CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

        if (results.Errors.HasErrors)
        {
            foreach (CompilerError error in results.Errors)
            {
                Console.WriteLine($"Error: {error.ErrorText}");
            }
        }
        else
        {
            // 通过反射加载编译后的程序集
            Assembly assembly = results.CompiledAssembly;

            // 创建MyDynamicClass的实例
            Type type = assembly.GetType("MyDynamicClass");
            object instance = Activator.CreateInstance(type);

            // 获取并调用MyMethod方法
            MethodInfo methodInfo = type.GetMethod("MyMethod");
            methodInfo.Invoke(instance, null);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        DynamicCompiler compiler = new DynamicCompiler();
        compiler.CompileAndExecute();
    }
}

在这个示例中,我们首先定义了一个包含`MyDynamicClass`和`MyMethod`的C#代码字符串。然后,我们使用`CSharpCodeProvider`来编译这段代码。如果编译成功,我们加载编译后的程序集,并通过反射来创建`MyDynamicClass`的实例,最后调用其`MyMethod`方法。

请注意,这个例子直接编译并运行了硬编码的代码字符串。在实际应用中,你可能需要构建更复杂的代码字符串,或者从外部源(如数据库或文件)读取代码。

另外,对于映射机制,你可能需要根据具体情况设计一个映射表或策略,将方法名或某种标识符映射到动态编译的代码上,以便在运行时根据需要执行相应的方法。这通常涉及到更复杂的数据结构和逻辑处理。