如何找到应该在哪里调用静态方法的地方?

时间:2019-04-18 15:06:10

标签: c# reflection design-time

public void SomeGoodMethod(Cube cube)
{
  Friends.Show(() => cube.Solve());
}

public void SomeBadMethod(Cube cube)
{
  cube.Solve();
}

我知道我可以找到数百种通过反射使用Cube参数的方法。如何找到不调用静态方法的方法:Friends.Show(在设计时或运行时)?

1 个答案:

答案 0 :(得分:0)

由于Joroen Mostert的评论,我得以整理一些代码。

foreach (var type in types)
{
  var callsShow = false;

  foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
  {
    var byteArray = method.GetMethodBody()?.GetILAsByteArray();
    if (byteArray == null)
    {
      continue;
    }

    var bytes = BitConverter.ToString(byteArray);
    var isMatch = Regex.IsMatch(bytes, "14-.*-28-.*-00-2B-26");
    callsShow = callsShow || isMatch;
  }
  if (!callsShow)
  {
    MightBeBad(type);
  }
}

我通过实验产生了正则表达式,并使用一种具有各种参数和通用参数配置的方法反复调用Friends.Show,并在字节中寻找重复的序列。 YMMV

在检查的数百个类别中,发现2个真阳性和10个假阳性。误报来自内部尝试块和其他异常情况。不过,很少有人可以手动检查。

还请注意:调试和发布版本之间的模式可能会有所不同。