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

CSX脚本中获取当前提交实例并反射调用非静态方法的可行性问询

在C# CSX脚本中通过反射调用非静态实例方法

当然可行!你遇到的问题核心是:CSX脚本里的顶级非静态方法属于一个动态生成的类的实例,但没法直接用this获取这个实例。不过我们可以通过MethodBase.GetCurrentMethod()的Target属性拿到它。

解决方案代码示例

using System.Reflection;

void Foo() 
{
    Console.WriteLine("Foo successfully invoked via reflection!");
}

// 获取当前执行的顶级代码所在的方法
var topLevelMethod = MethodBase.GetCurrentMethod();
// 这个方法的Target就是CSX生成的类的实例
var scriptInstance = topLevelMethod.Target;

// 获取Foo方法的引用
var fooMethod = topLevelMethod.DeclaringType.GetMethod("Foo");
// 传入实例调用非静态方法
fooMethod.Invoke(scriptInstance, null);

原理说明

CSX脚本在执行时,会把顶级作用域的代码编译到一个动态生成的类的实例方法中,所以:

  • MethodBase.GetCurrentMethod()返回的就是这个顶级实例方法
  • 这个方法的Target属性指向的就是该动态类的当前实例,也就是你需要传给Invoke的实例对象

这样就避开了无法使用this的限制,成功调用非静态的Foo方法。另外如果脚本里有多个方法或者复杂的捕获逻辑,这个方法依然有效——它直接从当前执行的栈帧中获取实例,不受脚本结构影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:49