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
相关产品推荐
相关产品推荐

