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

时间:2010-04-09 09:34:27

标签: c# .net namespaces

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

我想应该使用一些反思,但我无法弄明白。

有什么想法吗?

5 个答案:

答案 0 :(得分: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);
        }
    }
}

其中CS0234是:

  

类型或命名空间名称'name'可以   在类或命名空间中不存在   '范围'(你错过了一个集会吗?   引用?)

自定义引用添加:

settings.ReferencedAssemblies.Add("Foobar.dll")

用法:

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

答案 1 :(得分:4)

您的问题“如何检查字符串是否为命名空间”仅在您考虑 where 检查命名空间时才有效。

命名空间是类名的前缀,类的范围限于程序集。要检查命名空间是否存在,您需要确定准备查看哪些程序集以查找命名空间的存在。

一旦确定了准备查看哪些程序集,就可以遍历它们以查找特定名称空间的存在,如下所示:

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;
}

答案 2 :(得分:2)

你能这样做吗?

Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespaceList = new List<string>();

foreach (Type type in asm.GetTypes())
{
    namespaceList.Add(type.Namespace);
}

然后检查字符串是否在列表中?

(请注意,这不是经过测试的代码!)

答案 3 :(得分:0)

CLR实际上没有“名称空间”的概念:它们实际上只不过是命名约定。因此,没有API可以“列出命名空间”或“获取命名空间”,甚至“获取此命名空间中的所有类型”。

您可以做的最好的事情是遍历所有已加载的程序集,然后遍历每个程序集中的所有导出类型,并检查给定字符串是否是任何这些类型名称的“前缀”。我想这个解决方案不会是世界上最快的,但它也不会完全不可行。

答案 4 :(得分:-2)

命名空间没有反映。命名空间定义完整类型名称。所以你需要做的是:

  • 枚举所有类型(您没有指定源集,假设是.NET Framework,那么您需要包含所有默认的.NET程序集(查看创建项目时由VS引用的那些),或者您的自定义程序集,然后在装配中输入。)
  • 在给定类型
  • 上查找Namespace属性

您需要使用的内容:

Assembly.Load method

Assembly.GetTypes method

Type.Namespace property