locked
¿Cómo obtengo el espacio de nombres de la raíz? RRS feed

  • Pregunta

  • Con este código obtengo el nombre del ensamblado (Primera casilla de la imagen):

    Dim oEnsamblado As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly

    msgbox(oEnsamblado.GetName.Name)

    ¿Cómo sería el código para obtener el espacio de nombres de la raíz? (segunda casilla de la imagen)

    domingo, 2 de octubre de 2016 20:53

Respuestas

  • Hola James-2016,

    Estaba haciendo unas pruebas, y finalicé con el siguiente código :

    Dim ensamblado = Assembly.GetExecutingAssembly
    Dim raiz = ensamblado.GetTypes().Select(Function(x) x.Namespace).FirstOrDefault
    
    MessageBox.Show(String.Format("Ensamblado : {0}{2}Nombre raíz : {1}",
                    ensamblado.GetName().Name, raiz, Environment.NewLine))

    Prueba y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta Pedro Ávila lunes, 3 de octubre de 2016 15:35
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:39
    lunes, 3 de octubre de 2016 3:25
  • James-2016,

    La función GetTypes() retorna una colección de tipos definidos en el ensamblado, de hecho puedes darle una vista si iteras por los elementos de la colección (tipo NameSpace):

    Dim assembly = System.Reflection.Assembly.GetExecutingAssembly
    
    For Each item As Type In assembly.GetTypes()
    	MessageBox.Show(item.Namespace)
    Next


    De la lista queda la tarea de recuperar el espacio de nombres raíz (alto nivel) y para ello es tan simple como descartar los espacios de nombres subyacentes:

    Private Function ObtenerTopLevelNamespace(t As Type) As String
    
    	Dim EspacioNombres As String = If(t.Namespace, "")
    
    	Return If(EspacioNombres.IndexOf("."c) = -1,
    		EspacioNombres,
    		EspacioNombres.Substring(0, EspacioNombres.IndexOf("."c)))
    
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
    	Dim assembly = System.Reflection.Assembly.GetExecutingAssembly        
    
    	For Each item As String In assembly.GetTypes().
    					Select(Function(t) ObtenerTopLevelNamespace(t)).
    					Where(Function(t) Not String.IsNullOrEmpty(t)).
    					Distinct()
    		MessageBox.Show(item)
    	Next
    
    End Sub



    Respecto a tu pregunta de la función Format():

    La forma más simple de la función es la sustitución de objetos bajo un formato, aunque en el ejemplo no formatea un objeto la instrucción sirve para interpolar, es decir, insertar textos dentro de una cadena bajo un orden que lo define el número que va entre llaves. Un ejemplo con formato de moneda y dos decimales:

    Dim Monto As Decimal = 100
    Dim FormatoSalida As String = String.Format("El monto a pagar es {0:C2}", Monto)
    
    'Resultado: El monto a pagar es $.100.00


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Propuesto como respuesta Pedro Ávila lunes, 3 de octubre de 2016 15:35
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:37
    lunes, 3 de octubre de 2016 6:29
  • Gracias por ambas respuestas, devuelve el espacio de nombres raiz con presición.

    Me queda una duda, dado que para obtenerlo usas un For, existe la posibilidad que devuelva más de un valor? o siempre se obtendrá solo uno que corresponde necesariamente al Espacio de nombres de la raiz (o sea exactamente al valor de la segunda casilla de la imagen que puse al principio)

    Por favor explícame exactamente cómo funciona este for para filtrarlo:

    For Each item As String In assembly.GetTypes().
    					Select(Function(t) ObtenerTopLevelNamespace(t)).
    					Where(Function(t) Not String.IsNullOrEmpty(t)).
    					Distinct()



    La idea de la Función ObtenerTopLevelNameespace es recuperar sólo los espacios de nombre de nivel alto (raíz), de hecho lo puedes hacer bajo cualquier forma teniendo cuidando de las excepciones que se presenten. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:39
    lunes, 3 de octubre de 2016 16:22
  • mm esa también es una buena alternativa.

    Respecto a lo otro, es una manera más eficiente de visualizar texto. Gracias por todo.

    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:37
    lunes, 3 de octubre de 2016 17:37

Todas las respuestas

  • Hola James-2016,

    Estaba haciendo unas pruebas, y finalicé con el siguiente código :

    Dim ensamblado = Assembly.GetExecutingAssembly
    Dim raiz = ensamblado.GetTypes().Select(Function(x) x.Namespace).FirstOrDefault
    
    MessageBox.Show(String.Format("Ensamblado : {0}{2}Nombre raíz : {1}",
                    ensamblado.GetName().Name, raiz, Environment.NewLine))

    Prueba y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta Pedro Ávila lunes, 3 de octubre de 2016 15:35
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:39
    lunes, 3 de octubre de 2016 3:25
  • Gracias, le añade al final un .My pero creo que se soluciona extrayendo la cadena devuelta sin esos tres caracteres.

    Si no es mucho pedir ¿qué hace exactamente la línea dentro de ese MessageBox.Show?, las llaves son una especie de parámetros no?


    • Editado James-2016 lunes, 3 de octubre de 2016 4:48
    lunes, 3 de octubre de 2016 4:42
  • James-2016,

    La función GetTypes() retorna una colección de tipos definidos en el ensamblado, de hecho puedes darle una vista si iteras por los elementos de la colección (tipo NameSpace):

    Dim assembly = System.Reflection.Assembly.GetExecutingAssembly
    
    For Each item As Type In assembly.GetTypes()
    	MessageBox.Show(item.Namespace)
    Next


    De la lista queda la tarea de recuperar el espacio de nombres raíz (alto nivel) y para ello es tan simple como descartar los espacios de nombres subyacentes:

    Private Function ObtenerTopLevelNamespace(t As Type) As String
    
    	Dim EspacioNombres As String = If(t.Namespace, "")
    
    	Return If(EspacioNombres.IndexOf("."c) = -1,
    		EspacioNombres,
    		EspacioNombres.Substring(0, EspacioNombres.IndexOf("."c)))
    
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
    	Dim assembly = System.Reflection.Assembly.GetExecutingAssembly        
    
    	For Each item As String In assembly.GetTypes().
    					Select(Function(t) ObtenerTopLevelNamespace(t)).
    					Where(Function(t) Not String.IsNullOrEmpty(t)).
    					Distinct()
    		MessageBox.Show(item)
    	Next
    
    End Sub



    Respecto a tu pregunta de la función Format():

    La forma más simple de la función es la sustitución de objetos bajo un formato, aunque en el ejemplo no formatea un objeto la instrucción sirve para interpolar, es decir, insertar textos dentro de una cadena bajo un orden que lo define el número que va entre llaves. Un ejemplo con formato de moneda y dos decimales:

    Dim Monto As Decimal = 100
    Dim FormatoSalida As String = String.Format("El monto a pagar es {0:C2}", Monto)
    
    'Resultado: El monto a pagar es $.100.00


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Propuesto como respuesta Pedro Ávila lunes, 3 de octubre de 2016 15:35
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:37
    lunes, 3 de octubre de 2016 6:29
  • Gracias por ambas respuestas, devuelve el espacio de nombres raiz con presición.

    Me queda una duda, dado que para obtenerlo usas un For, existe la posibilidad que devuelva más de un valor? o siempre se obtendrá solo uno que corresponde necesariamente al Espacio de nombres de la raiz (o sea exactamente al valor de la segunda casilla de la imagen que puse al principio)

    Por favor explícame exactamente cómo funciona este for para filtrarlo:

    For Each item As String In assembly.GetTypes().
    					Select(Function(t) ObtenerTopLevelNamespace(t)).
    					Where(Function(t) Not String.IsNullOrEmpty(t)).
    					Distinct()



    • Editado James-2016 lunes, 3 de octubre de 2016 14:29
    lunes, 3 de octubre de 2016 14:26
  • Gracias, le añade al final un .My pero creo que se soluciona extrayendo la cadena devuelta sin esos tres caracteres.

    Si no es mucho pedir ¿qué hace exactamente la línea dentro de ese MessageBox.Show?, las llaves son una especie de parámetros no?


    Hola James-2016,

    Cuando usas el getTypes() mostrará una lista entre los cuales existirá datos repetidos, por lo que si buscas el elemento que no contenga el punto, sería más que suficiente :

    Dim raiz = ensamblado.GetTypes().Select(Function(x) x.Namespace).
                     Where(Function(x) Not x.Contains(".")).FirstOrDefault

    Las líneas que uso en el MessageBox es un formato que uso en el String.Format(...), el cual recibe el formato en string, seguido de los objetos que reemplazarán en cada posición del formato.

    MessageBox.Show(String.Format("Ensamblado : {0}{2}Nombre raíz : {1}",valor1, valor2, valor3)

    Dónde : 

    - El valor de la variable "valor1" será reemplazada por {0}

    - El valor de la variable "valor2" será reemplazada por {1}

    - El valor de la variable "valor3" será reemplazada por {2}

    Así evitas estar concatenando cadenas de texto usando el & o String.Concat(...)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 3 de octubre de 2016 16:03
  • Gracias por ambas respuestas, devuelve el espacio de nombres raiz con presición.

    Me queda una duda, dado que para obtenerlo usas un For, existe la posibilidad que devuelva más de un valor? o siempre se obtendrá solo uno que corresponde necesariamente al Espacio de nombres de la raiz (o sea exactamente al valor de la segunda casilla de la imagen que puse al principio)

    Por favor explícame exactamente cómo funciona este for para filtrarlo:

    For Each item As String In assembly.GetTypes().
    					Select(Function(t) ObtenerTopLevelNamespace(t)).
    					Where(Function(t) Not String.IsNullOrEmpty(t)).
    					Distinct()



    La idea de la Función ObtenerTopLevelNameespace es recuperar sólo los espacios de nombre de nivel alto (raíz), de hecho lo puedes hacer bajo cualquier forma teniendo cuidando de las excepciones que se presenten. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:39
    lunes, 3 de octubre de 2016 16:22
  • mm esa también es una buena alternativa.

    Respecto a lo otro, es una manera más eficiente de visualizar texto. Gracias por todo.

    • Marcado como respuesta James-2016 lunes, 3 de octubre de 2016 17:37
    lunes, 3 de octubre de 2016 17:37
  • Ok, gracias por todo obtuve dos soluciones, ambas muy buenas.
    lunes, 3 de octubre de 2016 17:38