2010-04-09 86 views
8

我有一個字符串,我想檢查它是否代表一個適當的命名空間,例如。 System.IO是好的,但System.Lol不是。如何檢查字符串是否爲命名空間

我想應該使用一些反射,但我無法弄清楚這一點。

有什麼想法?

回答

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

順便說一句,你不能使用保留關鍵字'namespace'作爲變量名;) – abatishchev 2010-04-09 10:32:15

+0

只是爲了正確性,你應該使用@ -ize命名空間參數,namespace是一個C#關鍵字:) – Marek 2010-04-09 10:32:45

+1

哦,太挑剔了!我很肯定沒有,答案是清晰的,但編輯是你的。 :) – 2010-04-09 11:44:04

0

CLR並沒有真正具有「命名空間」的概念:它們實際上不過是命名約定。所以沒有API來「列出命名空間」或「獲取命名空間」,甚至「獲得這個命名空間中的所有類型」。

您可以做的最好的方法是遍歷所有已加載的程序集,然後遍歷每個程序集中的所有導出類型,並檢查給定的字符串是否是任何這些類型名稱的「前綴」。我想這個解決方案不會是世界上最快的,但它也不會完全不可行。

-2

命名空間沒有反映。名稱空間定義完整的類型名稱。所以你需要做的是:

  • 枚舉所有類型(你不指定源集,讓我們說,.NET框架,那麼你需要包括所有的默認.NET程序集(看看由VS引用的那些)當你創建一個項目時)或你的自定義程序集,然後輸入程序集)。
  • 查找Namespace屬性給定類型

你需要使用什麼:

Assembly.Load method

Assembly.GetTypes method

Type.Namespace property

2

你能做到這一點?

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

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

然後只是檢查一下,看看字符串是否在列表中?

(被警告,這是沒有經過測試的代碼!)

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是:

類型或命名空間名稱 '名' 呢 不存在於類或名稱空間 '範圍'(您是否缺少程序集 參考?)

定製引用加:

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

+1爲了娛樂 – Marek 2010-04-09 10:34:57