2013-08-28 5 views
28

Я пишу программу, которая нуждается в пространстве имен программы, но я не могу понять, как ее получить. Я хочу, чтобы конечный результат был в строке.Как получить пространство имен в строку C#

Я смог найти страницу MSDN по этой теме, но это оказалось для меня бесполезным. http://msdn.microsoft.com/en-us/library/system.type.namespace.aspx

Любая помощь будет принята с благодарностью. Программа написана на C#.

EDIT: Извините, ребята, это не консольное приложение.

+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 («Пространство имен: {0}.», MyType.Namespace); мне неизвестно. –

+0

Хорошо, что это за приложение? –

+5

WriteLine не является неотъемлемой частью ее. Используйте 'string.Format()' и двигайтесь дальше. –

3

Вы можете просто использовать typeof, а затем пройти в классе (I.e. Программа):

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

если yo и есть пункт x класса A в пространстве имен B вы можете использовать:

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 есть ключевое слово name.

string name = nameof(MyNamespace); 

Это имеет несколько преимуществ:

  1. Название решается во время компиляции
  2. Название изменится, когда рефакторинга имен
  3. Это синтаксис проверяется, поэтому имя должно существовать
  4. код очистителя
+2

Это не дает полного пространства имен. Было бы здорово, если бы это произошло. –

0

Если вы выполняете эту команду из класса в пространстве имен вам нужно захватить, то вы можете просто использовать:

GetType().Namespace

Это прекрасно работает как тогда позволяет реорганизовать пространство имен и по-прежнему будет работать.

0

как рулон УПП все почтовые ответы: получения значений всех столбцов из таблицы, приведенной в виде строки TABLENAME:

 

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

это очень легко, если мы используем суматоху, этот пример использует LINQ контекст ..

Смежные вопросы