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

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

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

有什么想法吗?

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

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

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

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

试试这种方法:

 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() .Any(e => String.Equals( e.ErrorText, "CS0234", StringComparison.Ordinal)); } public void Dispose() { if (results != null) { System.IO.File.Delete(results.CompiledAssembly.Location); } } } 

其中CS0234是:

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

自定义引用添加:

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

你能这样做吗?

 Assembly asm = Assembly.GetExecutingAssembly(); List namespaceList = new List(); foreach (Type type in asm.GetTypes()) { namespaceList.Add(type.Namespace); } 

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

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

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

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

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

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

你需要使用什么:

Assembly.Load方法

Assembly.GetTypes方法

Type.Namespace属性