2

如何获取在 C# 文件开头加载的命名空间的名称?例如,获取下面的六个命名空间名称。

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;

namespace MyNM
{
    class MyClass{}
}
4

3 回答 3

2

这将返回已执行程序集的所有程序集引用。

尽管如此,这不会只返回特定文件中使用的命名空间——这在运行时是不可能的。

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);
}
于 2012-05-10T01:14:24.420 回答
2

如何获取在 C# 文件开头加载的命名空间的名称?例如,获取下面的六个命名空间名称。

除了自己解析文件(或使用 Roslyn CTP 之类的东西来解析 C# 文件)之外,您不能这样做。

命名空间不是“加载”的——它们仅由编译器在编译时使用,以解析适当的类型名称。

您可以使用Assembly.GetReferencedAssemblies来获取程序(即:项目)引用的程序集,但这是一个程序集范围的引用集,与使用特定文件中包含的指令的命名空间明显不同。

于 2012-05-10T01:15:15.543 回答
0

您必须解析文件以派生语法元素。如上所述,您可以使用 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,因此它可能会在未来中断。

于 2012-12-03T17:48:48.473 回答