我有一個字符串,我想檢查它是否代表一個適當的命名空間,例如。 System.IO
是好的,但System.Lol
不是。如何檢查字符串是否爲命名空間
我想應該使用一些反射,但我無法弄清楚這一點。
有什麼想法?
我有一個字符串,我想檢查它是否代表一個適當的命名空間,例如。 System.IO
是好的,但System.Lol
不是。如何檢查字符串是否爲命名空間
我想應該使用一些反射,但我無法弄清楚這一點。
有什麼想法?
你的問題「如何檢查是否字符串是一個命名空間」是唯一有效的,當你考慮其中你檢查命名空間。
命名空間是類名的前綴,類的作用域是一個程序集。要檢查名稱空間是否存在,您需要決定準備查看哪些程序集以查找命名空間的存在。
一旦你決定哪些程序集你準備一下通過,你可以遍歷它們特定名稱空間的存在,像這樣:
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;
}
CLR並沒有真正具有「命名空間」的概念:它們實際上不過是命名約定。所以沒有API來「列出命名空間」或「獲取命名空間」,甚至「獲得這個命名空間中的所有類型」。
您可以做的最好的方法是遍歷所有已加載的程序集,然後遍歷每個程序集中的所有導出類型,並檢查給定的字符串是否是任何這些類型名稱的「前綴」。我想這個解決方案不會是世界上最快的,但它也不會完全不可行。
命名空間沒有反映。名稱空間定義完整的類型名稱。所以你需要做的是:
你需要使用什麼:
你能做到這一點?
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespaceList = new List<string>();
foreach (Type type in asm.GetTypes())
{
namespaceList.Add(type.Namespace);
}
然後只是檢查一下,看看字符串是否在列表中?
(被警告,這是沒有經過測試的代碼!)
試試這個辦法:
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
是:
類型或命名空間名稱 '名' 呢 不存在於類或名稱空間 '範圍'(您是否缺少程序集 參考?)
所
定製引用加:
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爲了娛樂 – Marek 2010-04-09 10:34:57
順便說一句,你不能使用保留關鍵字'namespace'作爲變量名;) – abatishchev 2010-04-09 10:32:15
只是爲了正確性,你應該使用@ -ize命名空間參數,namespace是一個C#關鍵字:) – Marek 2010-04-09 10:32:45
哦,太挑剔了!我很肯定沒有,答案是清晰的,但編輯是你的。 :) – 2010-04-09 11:44:04