如何获取在 C# 文件开头加载的命名空间的名称?例如,获取下面的六个命名空间名称。
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
namespace MyNM
{
class MyClass{}
}
如何获取在 C# 文件开头加载的命名空间的名称?例如,获取下面的六个命名空间名称。
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
namespace MyNM
{
class MyClass{}
}
这将返回已执行程序集的所有程序集引用。
尽管如此,这不会只返回特定文件中使用的命名空间——这在运行时是不可能的。
var asms = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var referencedAssembly in asms)
{
Console.WriteLine(referencedAssembly.Name);
}
虽然,从技术上讲,如果您知道包含当前代码的文件的名称,您可以在运行时读取该文件并提取“使用”。
编辑
这样做的方法是:
public static IEnumerable<string> GetUsings()
{
// Gets the file name of the caller
var fileName = new StackTrace(true).GetFrame(1).GetFileName();
// Get the "using" lines and extract and full namespace
return File.ReadAllLines(fileName)
.Select(line => Regex.Match(line, "^\\s*using ([^;]*)"))
.Where(match => match.Success)
.Select(match => match.Groups[1].Value);
}
如何获取在 C# 文件开头加载的命名空间的名称?例如,获取下面的六个命名空间名称。
除了自己解析文件(或使用 Roslyn CTP 之类的东西来解析 C# 文件)之外,您不能这样做。
命名空间不是“加载”的——它们仅由编译器在编译时使用,以解析适当的类型名称。
您可以使用Assembly.GetReferencedAssemblies来获取程序集(即:项目)引用的程序集,但这是一个程序集范围的引用集,与使用特定文件中包含的指令的命名空间明显不同。
您必须解析文件以派生语法元素。如上所述,您可以使用 System.Reflections 作为外部引用,也可以使用新的Roslyn 编译器服务,如下所示
string codeSnippet = @"using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
namespace MyNM
{
class MyClass{}
}";
//APPROACH:
//Get using statements in the code snippet from the syntax tree
//find qualified name(eg:System.Text..) in the using directive
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(codeSnippet);
SyntaxNode root = tree.GetRoot();
IEnumerable<UsingDirectiveSyntax> usingDirectives = root.DescendantNodes().OfType<UsingDirectiveSyntax>();
foreach(UsingDirectiveSyntax usingDirective in usingDirectives){
NameSyntax ns = usingDirective.Name;
Console.WriteLine(ns.GetText());
}
注意:代码使用旧版本的 Roslyn API。由于 Roslyn 仍然是 CTP,因此它可能会在未来中断。