如何检查字符串是否是命名空间

Dar*_*mak 8 .net c# namespaces

我有一个字符串,我想检查它是否代表一个合适的命名空间,例如.没问题System.IO,但事实System.Lol并非如此.

我想应该使用一些反思,但我无法弄清楚这一点.

有什么想法吗?

aba*_*hev 8

试试这种方法:

using System.CodeDom.Compiler;
using System.Linq;

class NamespaceTester : IDisposable
{
    private CodeDomProvider provider = CodeDomProvider.CreateProvider("c#");
    private CompilerParameters settings = new CompilerParameters();
    private CompilerResults results;

    public bool Test(string[] namespaces)
    {
        results = provider.CompileAssemblyFromSource(
            settings,
            namespaces.Select(n => String.Format("using {0};", n)).ToArray());
        return results.Errors
            .OfType<CompilerError>()
            .Any(e => String.Equals(
                e.ErrorText,
                "CS0234",
                StringComparison.Ordinal));
    }

    public void Dispose()
    {
        if (results != null)
        {
            System.IO.File.Delete(results.CompiledAssembly.Location);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里CS0234:

类或命名空间名称"name"在类或命名空间"scope"中不存在(您是否缺少程序集引用?)

自定义引用添加:

settings.ReferencedAssemblies.Add("Foobar.dll")
Run Code Online (Sandbox Code Playgroud)

用法:

public static void Main(string[] args)
{
    using (var tester = new NamespaceTester())
    {
        var success = tester.Test(new[] {
            "System.IO",
            "System.LOL"
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*ner 4

仅当您考虑在何处检查名称空间时,您的问题“如何检查字符串是否是名称空间”才有效。

命名空间是类名的前缀,类的作用域是程序集。要检查名称空间是否存在,您需要决定准备查看哪些程序集以查找名称空间是否存在。

一旦您决定准备查看哪些程序集,您就可以迭代它们来确定是否存在特定命名空间,如下所示:

public bool NamespaceExists(IEnumerable<Assembly> assemblies, string ns)
{
    foreach(Assembly assembly in assemblies)
    {
        if(assembly.GetTypes().Any(type => type.Namespace == ns))
            return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • `返回程序集.SelectMany(a =&gt; a.GetTypes()).Any(t =&gt; t.Namespace == ns)` (2认同)