如何获取方法 (.NET) 中使用的字段?
在 .NET 中,使用反射如何获取方法中使用的类变量?
例如:
class A
{
UltraClass B = new(..);
SupaClass C = new(..);
void M1()
{
B.xyz(); // it can be a method call
int a = C.a; // a variable access
}
}
注意: GetClassVariablesInMethod(M1 MethodInfo) 返回 B 和 C 变量。 我所说的变量是指该特定变量的值和/或类型和构造函数参数。
In .NET, using reflection how can I get class variables that are used in a method?
Ex:
class A
{
UltraClass B = new(..);
SupaClass C = new(..);
void M1()
{
B.xyz(); // it can be a method call
int a = C.a; // a variable access
}
}
Note:
GetClassVariablesInMethod(M1 MethodInfo) returns B and C variables.
By variables I mean Value and/or Type and Constructor Parameters of that specific variable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
有很多不同的答案,但由于没有一个答案对我有吸引力,所以这是我的。它使用我的基于反射的 IL 阅读器。
这是一个检索方法使用的所有字段的方法:
There's a lot of different answers, but as not a single one appeals to me, here's mine. It's using my Reflection based IL reader.
Here's a method retrieving all the fields used by a method:
这是正确答案的完整版本。这使用了其他答案中的材料,但包含了一个其他人没有发现的重要错误修复。
Here's a complete version of the correct answer. This uses material from other answers, but incorporates an important bugfix which no-one else spotted.
您需要获取 MethodInfo。调用 GetMethodBody() 获取方法体结构,然后对其调用 GetILasByteArray。将该字节数组转换为可理解的 IL 流。
粗略地说,
OpCodeList 是通过以下方式构造的,
然后您可以找出哪些指令是 IL 属性调用或成员变量查找或您需要的任何指令,然后通过 GetType().Module.ResolveField 进行解析。
(以上或多或少的工作需要注意的代码是从我所做的一个更大的项目中剥离出来的,所以可能遗漏了一些小细节)。
编辑:参数大小是 OpCode 上的一种扩展方法,它仅使用查找表来查找适当的值。
您可以在 ECMA 335 您还需要查看其中的操作码来查找要搜索哪些操作码来查找调用你正在寻找。
You need to get the MethodInfo. Call GetMethodBody() to get the method body structure and then call GetILAsByteArray on that. The convert that byte array into a stream of comprehensible IL.
Roughly speaking
where OpCodeList is constructed via
You can then work out which instructions are IL property calls or member variable look ups or whatever you require and resolve then via GetType().Module.ResolveField.
(Caveat code above more or less work but was ripped from a bigger project I did so maybe missing minor details).
Edit: Argument size is an extension method on OpCode that just uses a look up table to do find the appropriate value
You'll find sizes in ECMA 335 which you'll also need to look at for the OpCodes to find which OpCodes you to search for to find the calls you are looking for.
反射主要是一个用于检查元数据的 API。您想要做的是检查原始 IL,这不是反射支持的功能。反射仅将 IL 作为原始 byte[] 返回,必须手动检查。
Reflection is primarily an API for inspecting metadata. What you're trying to do is inspect raw IL which is not a supported function of reflection. Reflection just returns IL as a raw byte[] which must be manually inspected.
@Ian G:我已经从 ECMA 335 编译了列表,发现我可以使用
操作码长度列表在这里,如果有人需要的话:
@Ian G: I have compiled the list from ECMA 335 and found out that I can use
And the opcode length list is here, if anyone needs it: