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

如何获取Action的Target参数中的terrainTag成员?

解决方法

你碰到的Terrain.Views.TerrainManager.<>c__DisplayClass8_0是C#编译器为闭包自动生成的匿名类——因为你的Action<string>大概率是从lambda表达式或匿名方法创建的,编译器会把捕获的变量封装到这个类里,所以Target返回的就是这个类的实例。这类类型没法直接在代码里引用,但可以用反射来访问和修改它的成员。

具体实现代码:

  1. 先拿到Action的Target实例:
    var closureObj = yourAction.Target;
    
  2. 通过反射获取terrainTag字段(注意字段名要和原代码里捕获的变量名一致,编译器生成的字段名一般和原变量名相同):
    var terrainTagField = closureObj.GetType().GetField(
        "terrainTag", 
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
    );
    
  3. 读取或修改值:
    // 读取当前值
    var currentTag = terrainTagField.GetValue(closureObj);
    // 设置新值
    terrainTagField.SetValue(closureObj, "你的新标签内容");
    

几点提醒:

  • 闭包类的成员通常是private的,所以反射时必须加上BindingFlags.NonPublic和BindingFlags.Instance才能找到。
  • 如果原变量是值类型(比如int、struct),闭包里捕获的是副本,修改后不会影响原变量;如果是引用类型,修改的是对象的内部状态,会同步生效。
  • 这种方式依赖编译器的实现细节,不同.NET版本可能有变化,属于“hack”性质的操作,尽量别在生产代码里滥用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:05:47