如何获取Action的Target参数中的terrainTag成员?
解决方法
你碰到的Terrain.Views.TerrainManager.<>c__DisplayClass8_0是C#编译器为闭包自动生成的匿名类——因为你的Action<string>大概率是从lambda表达式或匿名方法创建的,编译器会把捕获的变量封装到这个类里,所以Target返回的就是这个类的实例。这类类型没法直接在代码里引用,但可以用反射来访问和修改它的成员。
具体实现代码:
- 先拿到Action的Target实例:
var closureObj = yourAction.Target; - 通过反射获取
terrainTag字段(注意字段名要和原代码里捕获的变量名一致,编译器生成的字段名一般和原变量名相同):var terrainTagField = closureObj.GetType().GetField( "terrainTag", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic ); - 读取或修改值:
// 读取当前值 var currentTag = terrainTagField.GetValue(closureObj); // 设置新值 terrainTagField.SetValue(closureObj, "你的新标签内容");
几点提醒:
- 闭包类的成员通常是
private的,所以反射时必须加上BindingFlags.NonPublic和BindingFlags.Instance才能找到。 - 如果原变量是值类型(比如
int、struct),闭包里捕获的是副本,修改后不会影响原变量;如果是引用类型,修改的是对象的内部状态,会同步生效。 - 这种方式依赖编译器的实现细节,不同.NET版本可能有变化,属于“hack”性质的操作,尽量别在生产代码里滥用。
内容的提问来源于stack exchange,提问作者user11095285
相关产品推荐
相关产品推荐

