public void SomeGoodMethod(Cube cube)
{
Friends.Show(() => cube.Solve());
}
public void SomeBadMethod(Cube cube)
{
cube.Solve();
}
我知道我可以找到数百种通过反射使用Cube
参数的方法。如何找到不调用静态方法的方法:Friends.Show
(在设计时或运行时)?
答案 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个假阳性。误报来自内部尝试块和其他异常情况。不过,很少有人可以手动检查。
还请注意:调试和发布版本之间的模式可能会有所不同。