Чтобы выяснить, где используется метод MyClass.Foo()
, необходимо проанализировать все классы всех сборок, которые имеют ссылку на сборку, содержащую MyClass
. Я написал простое доказательство того, как этот код может выглядеть. В моем примере я использовал эту библиотеку (это просто единственный файл .cs ), написанный Jb Evain:
Я написал небольшой тестовый класс для анализа:
public class TestClass
{
public void Test()
{
Console.WriteLine("Test");
Console.Write(10);
DateTime date = DateTime.Now;
Console.WriteLine(date);
}
}
И я написал этот код, чтобы распечатать все методы, используемые в TestClass.Test()
:
MethodBase methodBase = typeof(TestClass).GetMethod("Test");
var instructions = MethodBodyReader.GetInstructions(methodBase);
foreach (Instruction instruction in instructions)
{
MethodInfo methodInfo = instruction.Operand as MethodInfo;
if(methodInfo != null)
{
Type type = methodInfo.DeclaringType;
ParameterInfo[] parameters = methodInfo.GetParameters();
Console.WriteLine("{0}.{1}({2});",
type.FullName,
methodInfo.Name,
String.Join(", ", parameters.Select(p => p.ParameterType.FullName + " " + p.Name).ToArray())
);
}
}
Это дало мне следующий вывод:
System.Console.WriteLine(System.String value);
System.Console.Write(System.Int32 value);
System.DateTime.get_Now();
System.Console.WriteLine(System.Object value);
Этот пример явно далек от завершения, потому что он не обрабатывает параметры ref и out и не обрабатывает общие аргументы. Я уверен, что забыл и о других деталях. Это просто показывает, что это можно сделать.