gpt4 book ai didi

C# 反射 - 我可以检查一个方法是否调用另一个方法吗

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

我正在寻找一种方法来确保方法“A”调用方法“B”。所以粗略地说,这笔交易是..

class one
{
internal static void MethodA()
{
//Do Something here. SHOULD be calling B.
}

void MethodB()
{
//MUST be called by MethodA.
}
}

class two
{
internal void MethodA()
{
//Test that MethodA calls MethodB
}
}

我应该指出,我在这方面坚持使用 .Net 2.0,所以 ExpressionTrees 是行不通的。我什至不确定他们是否会提供帮助,但这是我最初的想法。

编辑:这是用于可视化源的圈复杂度的内部工具,因此我不关心破坏此处的封装。此外,..这很可能只能使用 System.Reflection 来完成。

最佳答案

这在很多情况下都是可行的,但您需要输入一些内容。您要做的第一件事是使用 ILReader 类 - 有一个 one here 的大纲(和 the one that Florian Doyon posted )。然后你想把它包装在这样的类中:

public class MethodCalls : IEnumerable<MethodInfo>
{
MethodBase _method;

public MethodCalls(MethodBase method)
{
_method = method;
}

public IEnumerator<MethodInfo> GetEnumerator()
{
// see here: http://blogs.msdn.com/haibo_luo/archive/2005/10/04/476242.aspx
ILReader reader = new ILReader(_method);

foreach (ILInstruction instruction in reader) {
CallInstruction call = instruction as CallInstruction;
CallVirtInstruction callvirt = instruction as CallVirstInstruction;
if (call != null)
{
yield return ToMethodInfo(call);
}
else if (callvirt != null)
{
yield return ToMethodInfo(callvirt);
}
}
}
}

MethodInfo ToMethodInfo(CallInstruction instr) { /* ... */ }

MethodInfo ToMethodInfo(CallVirtInstruction instr) { /* ... */ }

两种类型的 ToMethodInfo 均未定义,因为 CallInstruction 也未定义。尽管如此,这个大纲有望将您的问题转化为:

public static bool Calls(MethodBase caller, MethodInfo callee)
{
return new MethodCalls(caller).Contains(callee);
}

关于C# 反射 - 我可以检查一个方法是否调用另一个方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2132849/

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