2013-08-28 3 views
28

Sto scrivendo un programma che richiede lo spazio dei nomi del programma ma non riesco a capire come recuperarlo. Mi piacerebbe che il risultato finale fosse in una stringa.Come recuperare lo spazio dei nomi in una stringa C#

Sono stato in grado di trovare una pagina MSDN su questo argomento, ma si è rivelato inutile a me stesso. http://msdn.microsoft.com/en-us/library/system.type.namespace.aspx

Qualsiasi aiuto sarebbe apprezzato. Il programma è scritto in C#.

MODIFICA: Scusate ragazzi, questa non è un'applicazione per console.

+1

Non capisco chiaramente la tua domanda. Perché non scrivi semplicemente lo spazio dei nomi del tuo programma dove vuoi? Sta cambiando in qualche modo? – IllidanS4

+5

@ IllidanS4: questa è una domanda molto valida. L'hard-coding dello spazio dei nomi in una stringa del programma è una ricetta per il disastro: prima o poi qualcuno cambierà lo spazio dei nomi e dimenticherà o non si accorgerà che è anche codificato nel programma, e quindi fallirà. – RenniePet

+0

Caso di utilizzo: le risorse incorporate in un assieme hanno il percorso preceduto dal namespace. La risposta qui sotto dà un modo fortemente tipizzato di trovare quel prefisso. –

risposta

44

Questo dovrebbe funzionare:

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

scrivere alla console:

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

impostando un'etichetta WinForm:

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

O creare un metodo nella classe e l'uso pertinenti Ovunque:

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

Purtroppo non è un'applicazione console, quindi il significato di {0} nella riga: Console.WriteLine ("Namespace: {0}.", MyType.Namespace); è sconosciuto per me. –

+0

Ok, che tipo di applicazione è? –

+5

La WriteLine non è la parte essenziale di lei. Usa 'string.Format()' e vai avanti. –

3

Si potrebbe semplicemente utilizzare typeof e quindi passare in classe (I.e. Programma):

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

Quale sarebbe la stampa:

ConsoleApplication1 
8

mettere questo alla vostra assemblea:

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

Oppure, se volete questo metodo per essere in una libreria utilizzata dal programma, scrivilo in questo modo:

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

se si have x di classe A nel namespace B è possibile utilizzare:

string s = x.GetType().Namespace; 

senza s contiene "B"

è anche possibile utilizzare x.GetType().Name per ottenere il nome del tipo o x.GetType().FullName per ottenere sia

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

Sulla base del commento di Joe è ancora possibile utilizzare

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

con namespaceName essere una variabile per accedere al nome dello spazio dei nomi come valore di stringa.

4

Questo non si può sbagliare:

MethodBase.GetCurrentMethod().DeclaringType.Namespace 
+1

Com'è migliore della risposta accettata e delle altre varianti pubblicate qui? –

3

Per aggiungere a tutte le risposte.

Poiché C# 6.0 è il nome di parola chiave.

string name = nameof(MyNamespace); 

Questo ha diversi vantaggi:

  1. il nome viene risolto al momento della compilazione
  2. Il nome cambierà quando refactoring del namespace
  3. Si sintassi selezionata, in modo che il nome deve esistere
  4. codice detergente
+2

Tuttavia, questo non fornisce lo spazio dei nomi completo. Sarebbe bello se lo facesse. –

0

Se si sta eseguendo da una classe nello spazio dei nomi è necessario acquisire allora si può solo utilizzare:

GetType().Namespace

Questo funziona bene in quanto consente poi di refactoring lo spazio dei nomi e continuerà a funzionare.

0

come UPP rotolo tutte le risposte pubblicare: ottenere valori di tutte le colonne da una tabella dato come un tableName stringa:

 

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

è molto facile se usiamo indugi, questo esempio utilizza contesto LINQ ..