Dar*_*mak 8 .net c# namespaces
我有一个字符串,我想检查它是否代表一个合适的命名空间,例如.没问题System.IO,但事实System.Lol并非如此.
我想应该使用一些反思,但我无法弄清楚这一点.
有什么想法吗?
试试这种方法:
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)
仅当您考虑在何处检查名称空间时,您的问题“如何检查字符串是否是名称空间”才有效。
命名空间是类名的前缀,类的作用域是程序集。要检查名称空间是否存在,您需要决定准备查看哪些程序集以查找名称空间是否存在。
一旦您决定准备查看哪些程序集,您就可以迭代它们来确定是否存在特定命名空间,如下所示:
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)