Я хотел бы привести пример того, как можно исследовать код внутри метода.Как объяснили другие, это не может быть легко сделано с помощью собственного .NET Reflection API.Однако, используя Mono.Reflection API, вы можете программно разобрать код с помощью метода GetInstructions()
и проверить его во время выполнения.
Например, следующий код проверяет метод и вычисляет количество вызовов внутри него.В качестве примера использования такого кода, скажем, что я учитель (которым я являюсь) и инструктирую своих сокурсников программировать данный метод без использования какого-либо другого метода, затем, используя этот код в модульных тестах, я могу проверить, что данное ограничениеуважаемый.
public static class MethodInfoUtil
{
public static int NbOfInnerCalls(this MethodInfo mi)
{
return mi.GetInstructions().Count(
instruction => instruction.OpCode.FlowControl == FlowControl.Call);
}
}
Пример Консольная программа:
class Program
{
static int Add(int a, int b) => a + b;
static int Doubling(int a) => Add(a, a);
static int Quadrupling(int a) => Add(Add(a, a), Add(a, a));
static void Main(string[] args)
{
Console.WriteLine("Inner method calls");
Console.WriteLine(" Add: {0}", ((Func<int, int, int>)Add).Method.NbOfInnerCalls());
Console.WriteLine(" Doubling: {0}", ((Func<int, int>)Doubling).Method.NbOfInnerCalls());
Console.WriteLine("Quadrupling: {0}", ((Func<int, int>)Quadrupling).Method.NbOfInnerCalls());
}
}
// Output:
// Inner method calls
// Add: 0
// Doubling: 1
// Quadrupling: 3