Ответ 1
Это будет работать для всех типов в методах объявляющего класса, однако он не даст всех пространств имен для всех классов в файле, где он был до компиляции. Это невозможно, потому что после компиляции фреймворк не может знать, что было в файлах.
Итак, если у вас есть один класс для каждого файла, это будет работать: Если вам что-то не хватает (я ищу поля и методы, возможно, что-то не учитывается в учетной записи, если это так просто добавить)
List<string> namespaces = new List<string>();
var m = MethodInfo.GetCurrentMethod();
foreach (var mb in m.DeclaringType.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic))
{
if (mb.MemberType == MemberTypes.Method && ((MethodBase)mb).GetMethodBody() != null)
{
foreach (var p in ((MethodInfo)mb).GetMethodBody().LocalVariables)
{
if (!namespaces.Contains(p.LocalType.Namespace))
{
namespaces.Add(p.LocalType.Namespace);
Console.WriteLine(p.LocalType.Namespace);
}
}
}
else if (mb.MemberType == MemberTypes.Field) {
string ns = ((System.Reflection.FieldInfo)mb).FieldType.Namespace;
if (!namespaces.Contains(ns))
{
namespaces.Add(ns);
Console.WriteLine(ns);
}
}
}
Пример вывода для моего случая:
System
System.Collections.Generic
System.Reflection
WindowsFormsApplication2
System.Linq.Expressions