gpt4 book ai didi

c# - 使用反射在方法中列出(检测)闭包

转载 作者:行者123 更新时间:2023-11-30 17:45:28 25 4
gpt4 key购买 nike

我知道我可以在使用 MethodInfo.GetMethodBody().LocalVariables 的方法中遍历所有本地定义的变量。

但是如果我将一个方法定义为:

public static void somemethod( int someint )
{
int test = 1;

HM.M(() =>
{
test = 2;
});
}

匿名方法可以访问 someint 并作为闭包进行测试,但 GetMethodBody().LocalVariables 将为空。

有没有办法使用反射来检测闭包?

最佳答案

好吧,我找到了答案。 C# 中的闭包由编译器使用编译器生成的类实现。编译器生成一个类,在其中复制方法中可访问的所有变量,方法本身封装在此类中。外部变量值被复制到类中。

因此,在我上面的示例中,M 方法具有签名:

public void M( Action method )

获取闭包列表的步骤是:

MethodInfo mi = method.Method; 

FieldInfo[] fields = mi.DeclaringType.GetFields
(
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.Static
);

DeclaringType 将是编译器生成的类,用于实现闭包。

在 fields 数组中将列出所有闭包。

获取闭包的 VALUES 是另一回事,但这不是本题的一部分。

编辑:正如@leppie 所指出的,获取值很容易:

object res = fields[ 0 ].GetValue( method.Target );

关于c# - 使用反射在方法中列出(检测)闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com