2013-08-28 27 views
28

我正在寫一個程序,需要程序的命名空間,但我似乎無法弄清楚如何檢索它。我想最終結果是在一個字符串中。我怎樣才能檢索命名空間到一個字符串C#

我能找到關於這個主題的MSDN頁面,但它證明對我自己沒有幫助。 http://msdn.microsoft.com/en-us/library/system.type.namespace.aspx

任何幫助,將不勝感激。該程序是用C#編寫的。

編輯:抱歉的傢伙,這不是一個控制檯應用程序。

+1

我不明白你的問題。你爲什麼不直接在你想要的地方寫出程序的命名空間?它以某種方式改變? – IllidanS4

+5

@ IllidanS4:這是一個非常有效的問題。在程序中對字符串中的命名空間進行硬編碼是一種災難 - 遲早有人會改變命名空間並忘記或不知道它也被編碼到程序中,然後它將失敗。 – RenniePet

+0

用例:程序集中的嵌入式資源具有名稱空間前綴的路徑。下面的答案給出了一個強類型的查找前綴的方法。 –

回答

44

這應該工作:

var myType = typeof(MyClass); 
var n = myType.Namespace; 

寫出到控制檯:

Type myType = typeof(MyClass); 
Console.WriteLine("Namespace: {0}.", myType.Namespace); 

設置一個WinForm標籤:

Type myType = typeof(MyClass); 
namespaceLabel.Text = myType.Namespace; 

或相關類,並使用創建的方法任何地方:

public string GetThisNamespace() 
{ 
    return GetType().Namespace; 
} 
+0

不幸的是它不是控制檯應用程序,所以行中{0}的含義是:Console.WriteLine(「Namespace:{0}。」,myType.Namespace);我不知道。 –

+0

好的,它是什麼類型的應用程序? –

+5

WriteLine不是她必不可少的部分。使用'string.Format()'並繼續。 –

3

您可以簡單地使用typeof,然後傳入類(即,程序):

Console.WriteLine(typeof(Program).Namespace); 

這將打印:

ConsoleApplication1 
8

把這個程序集:

public static string GetCurrentNamespace() 
{ 
    return System.Reflection.Assembly.GetExecutingAssembly().EntryPoint.DeclaringType.Namespace; 
} 

或者,如果你想這個方法是在你的程序中使用的庫,這樣寫:

[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)] 
public static string GetCurrentNamespace() 
{ 
    return System.Reflection.Assembly.GetCallingAssembly().EntryPoint.DeclaringType.Namespace; 
} 
6

如果你已經在命名空間BA類的項目x你可以使用:

string s = x.GetType().Namespace; 

沒有s包含「B」

你也可以使用x.GetType().Name要獲得類型名稱或x.GetType().FullName兩全

2
Type myType = typeof(MyClass); 
// Get the namespace of the myClass class. 
Console.WriteLine("Namespace: {0}.", myType.Namespace); 

建立在喬的評論上,你仍然可以使用

Type myType = typeof(MyClass); 
// Get the namespace of the myClass class. 
var namespaceName = myType.Namespace.ToString(); 

namespaceName是作爲字符串值訪問命名空間名稱的變量。

4

這不能出差錯:

MethodBase.GetCurrentMethod().DeclaringType.Namespace 
+1

這比接受的答案和其他變體在這裏發佈的更好嗎? –

3

要添加到所有的答案。

由於C#6.0有關鍵字nameof。

string name = nameof(MyNamespace); 

這有幾個優點:

  1. 名稱是在編譯時解析
  2. 重構的命名空間
  3. 它的語法檢查時,該名稱將發生變化,因此該名稱必須存在
  4. 清潔代碼
+2

雖然這並不能提供完整的命名空間。如果是的話,會很棒。 –

0

如果你從一個類命名空間中的執行它,你需要捕捉,然後你可以使用:

GetType().Namespace

這工作得很好,因爲它然後讓你重構命名空間,仍然可以工作。

0
所有職位的答案

成卷UPP: 正從爲以字符串形式的表名的表中的所有列的價值觀:

 

    var tableName = "INVENTORY_PRICE"; 
       var assembly = Assembly.GetExecutingAssembly(); 

       var tip = typeof(Form3); 

       var t = assembly.GetType(tip.Namespace + "." + tableName); 
       if (t != null) 
       { 
        var foos = db.GetTable(t); 

        foreach (var f in foos) 
        { 
         Console.WriteLine(f + ":"); 
         foreach (var property in f.GetType().GetProperties()) 
          if (property != null) 
          { 
           var pv = property.GetValue(f, null); 
           Console.WriteLine(" " + property.Name + ":" + pv); 
          } 

         Console.WriteLine("------------------------------------------------"); 
        } 
       } 

這是非常容易,如果我們使用ADO,此示例使用LINQ背景下..

相關問題