2013-08-28 14 views
28

Piszę program, który potrzebuje przestrzeni nazw programu, ale nie mogę się dowiedzieć, jak go odzyskać. Chciałbym, żeby wynik końcowy był ciągiem.Jak mogę odzyskać przestrzeń nazw do łańcucha C#

Udało mi się znaleźć stronę MSDN na ten temat, ale okazało się to nieprzydatne dla mnie. http://msdn.microsoft.com/en-us/library/system.type.namespace.aspx

Każda pomoc zostanie doceniona. Program jest napisany w języku C#.

EDYCJA: Przepraszam, to nie jest aplikacja konsolowa.

+1

Nie rozumiem wyraźnie twojego pytania. Dlaczego po prostu nie napiszesz przestrzeni nazw swojego programu tam, gdzie chcesz? Czy to się zmienia? – IllidanS4

+5

@ IllidanS4: To jest bardzo ważne pytanie. Zakodowanie przestrzeni nazw w łańcuchu w programie jest receptą na katastrofę - wcześniej czy później ktoś zmieni przestrzeń nazw i zapomni lub będzie nieświadomy, że jest również zakodowany w programie, a następnie zawiedzie. – RenniePet

+0

Przypadek użycia: zasoby osadzone w zespole mają ścieżkę poprzedzoną przez przestrzeń nazw. Poniższa odpowiedź daje mocno typowy sposób na znalezienie tego prefiksu. –

Odpowiedz

44

To powinno działać:

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

Wpisz się do konsoli:

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

Ustawianie etykiety WinForm:

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

Albo utworzyć metody w danej klasie i użytkowania wszędzie:

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

Niestety, nie jest to aplikacja konsolowa, więc znaczenie {0} w linii: Console.WriteLine ("Namespace: {0}.", MyType.Namespace); jest mi nieznany. –

+0

Ok, jaki to rodzaj aplikacji? –

+5

Linia WriteLine nie jest jej istotną częścią. Użyj 'string.Format()' i przejdź dalej. –

3

Można po prostu użyć typeof, a następnie przekazać klasę (np. Program):

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

Które wydrukować:

ConsoleApplication1 
8

Włóż to do zespołu:

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

Albo jeśli chcesz ten sposób, aby być w bibliotece używane przez program, napisz to tak:

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

jeśli mają pozycję x klasy A w przestrzeni nazw B można użyć:

string s = x.GetType().Namespace; 

nie s zawiera „B”

Można również użyć x.GetType().Name uzyskać nazwę typu lub x.GetType().FullName dostać zarówno

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

Na podstawie komentarza Joego możesz nadal używać:

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

z namespaceName jest zmienną, aby uzyskać dostęp do nazwy przestrzeni nazw jako wartość ciągu.

4

To nie może się nie udać:

MethodBase.GetCurrentMethod().DeclaringType.Namespace 
+1

Jak to jest lepsze od zaakceptowanej odpowiedzi i innych wariantów zamieszczonych tutaj? –

3

Aby dodać do wszystkich odpowiedzi.

Od C# 6.0 jest nazwa słowa kluczowego.

string name = nameof(MyNamespace); 

Ma to kilka zalet:

  1. Nazwa zostanie rozwiązany w czasie kompilacji
  2. nazwa się zmieni, gdy refactoring nazw
  3. sprawdzane jest składnia, więc nazwa musi istnieć
  4. kod czyszczenia
+2

To jednak nie daje pełnej przestrzeni nazw. Byłoby wspaniale, gdyby tak było. –

0

Jeśli wykonanie go z klasy w przestrzeni nazw trzeba uchwycić następnie można po prostu użyć:

GetType().Namespace

Działa to dobrze, gdyż wtedy pozwala byłaby przestrzeń nazw i będzie nadal działać.

0

jako UPP walca wszystkie odpowiedzi pocztowe: uzyskanie wartości wszystkich kolumn z tabeli podanej jako TableName strun:

 

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

to jest bardzo proste, jeśli używamy ADO, próbka ta wykorzystuje kontekst LINQ ..

Powiązane problemy