You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C#中Textbox内的类定义字符串转为Dynamic对象?

将类定义字符串转换为Dynamic对象的方案

在.NET环境下,你可以通过以下几种方式实现将文本框中的类定义字符串转换为dynamic对象,主要依赖官方编译器API或简化脚本库:

一、使用官方Roslyn编译器API (Microsoft.CodeAnalysis.CSharp)

这是最通用的方案,支持完整的C#类定义编译,步骤清晰可控。

步骤与示例代码

  1. 先通过NuGet安装Microsoft.CodeAnalysis.CSharp包
  2. 使用以下代码编译类定义并实例化:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System;
using System.Reflection;
using System.IO;

public static dynamic CompileClassToDynamic(string classDefinition)
{
    // 添加必要的程序集引用
    var references = new[]
    {
        MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
        MetadataReference.CreateFromFile(typeof(Console).Assembly.Location)
    };

    // 构建编译单元
    var compilation = CSharpCompilation.Create(
        "TempDynamicAssembly",
        syntaxTrees: new[] { CSharpSyntaxTree.ParseText(classDefinition) },
        references: references,
        options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

    // 编译到内存流
    using var ms = new MemoryStream();
    var emitResult = compilation.Emit(ms);

    if (!emitResult.Success)
    {
        var errorMsg = string.Join(Environment.NewLine, 
            emitResult.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error));
        throw new InvalidOperationException($"编译失败:{errorMsg}");
    }

    // 加载编译后的程序集并创建实例
    ms.Position = 0;
    var assembly = Assembly.Load(ms.ToArray());
    var targetType = assembly.GetTypes()[0]; // 假设文本框中只有一个类定义
    return Activator.CreateInstance(targetType);
}

使用示例

假设文本框中的类定义是:

public class UserInfo
{
    public string Username { get; set; }
    public int Age { get; set; }
    public string GetGreeting() => $"Hi, I'm {Username}, {Age} years old.";
}

调用后即可像操作普通对象一样使用dynamic:

dynamic user = CompileClassToDynamic(textBox.Text);
user.Username = "Alice";
user.Age = 28;
Console.WriteLine(user.GetGreeting()); // 输出 Hi, I'm Alice, 28 years old.

二、使用Roslyn脚本API (Microsoft.CodeAnalysis.CSharp.Scripting)

如果不需要单独编译程序集,只是快速创建类实例,这个方案更简洁,直接通过脚本执行生成对象。

步骤与示例代码

  1. 通过NuGet安装Microsoft.CodeAnalysis.CSharp.Scripting包
  2. 使用异步方法执行脚本:
using Microsoft.CodeAnalysis.CSharp.Scripting;
using System.Threading.Tasks;

public static async Task<dynamic> CreateDynamicFromScript(string classDefinition)
{
    // 在脚本中拼接类定义和实例化代码
    var scriptCode = $@"
{classDefinition}
// 这里替换成你文本框中类的名称
new UserInfo();";

    return await CSharpScript.EvaluateAsync<dynamic>(
        scriptCode,
        ScriptOptions.Default.AddReferences(typeof(object).Assembly)
    );
}

三、注意事项

  • 安全风险:动态执行用户输入的代码存在极大安全隐患,恶意代码会直接在你的进程中执行,必须严格校验输入内容,或在隔离环境中运行。
  • 性能优化:频繁编译会生成大量临时程序集,可根据类定义的哈希值缓存编译后的程序集,避免重复编译。
  • 依赖处理:如果类定义中引用了其他自定义程序集或NuGet包,需要在编译时添加对应的MetadataReference。

内容的提问来源于stack exchange,提问作者user3165083

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:57:25