none
Devolución de Object en un Function RRS feed

  • Pregunta

  • Hola

    En un Function de un servicio quiero devolver un tipo anónimo que será recogido en una función de javascript

    Mi pregunta es si es correcto que el método devuelva Object o hay otras alternativas para hacerlo?.

        Public Function obtenerDatos() As Object
            Try

               Dim tH = New With {.M = "A", .T = "B", .N = "C"}

               Return tH
            Catch ex As Exception
                Return Nothing
            End Try

    End Function

    Un saludo.

    viernes, 9 de febrero de 2018 14:00

Respuestas

  • "Joseba Rguez" escribió:

    > El caso es que recojo el objeto anónimo en una función callback
    > javascript y funciona correctamente.
    >
    > function getDato(dato){
    >    alert(dato.T);
    > }

    Entiendo que el argumento dato de la función getDato será del tipo Object de JavaScript, el cual podrá ser visto como una colección de propiedades, de ahí que puedas obtener el valor de la propiedad llamada T:

    alert(dato.T);

    Debes de tener en cuenta que una vez que tu función de Visual Basic llamada ObtenerDatos devuelve un valor, éste ya no es un tipo de dato anónimo, sino más bien un tipo de dato bien conocido como es System.Object, que es el tipo de dato del que heredan todos los tipos de datos .NET, incluidos los tipos anónimos.

    Insisto en que los tipos anónimos solamente son reconocidos dentro del propio procedimiento donde son creados y utilizados, en tu caso, solamente dentro de la función ObtenerDatos, pero en ningún caso serán reconocidos como tales desde fuera de dicha función, y menos desde fuera de tu ensamblado de Visual Basic, los cuales podrán ser reconocidos como tipos Object, si es que el lenguaje de programación externo lo reconoce como un tipo de dato Object, claro está.

    Tipos de datos (JavaScript)

    Tipos de datos y estructuras en JavaScript


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 10 de febrero de 2018 5:49
    Moderador

Todas las respuestas

  • "Joseba Rguez" preguntó:

    > En un Function de un servicio quiero devolver un tipo anónimo que
    > será recogido en una función de javascript
    >
    > Mi pregunta es si es correcto que el método devuelva Object o hay
    > otras alternativas para hacerlo?.
    >
    >    Public Function obtenerDatos() As Object
    >
    >        Try
    >            Dim tH = New With {.M = "A", .T = "B", .N = "C"}
    >            Return tH
    >
    >        Catch ex As Exception
    >            Return Nothing
    >
    >        End Try
    >
    >    End Function

    Hola, Joseba:

    Entiendo que a la función no le va a quedar más remedio que devolver un valor System.Object, porque si bien el compilador de Visual Basic generará internamente una clase con las propiedades especificadas en la declaración del tipo anónimo, el nombre de dicha clase puede variar entre una compilación y otra, aparte que el nombre de la clase (por ejemplo, $AnonymousType1) suele tener un carácter de declaración de tipo ($), carácter éste que no está permitido en la declaración de una variable:

       
    Dim a As $AnonymousType1  ' --> Declaración no válida

    Y aunque la función pudiera devolver un valor del tipo $AnonymousType1, ¿cómo podría tu función de javascript reconocer ese tipo de dato?

    Piensa que los tipos anónimos están pensados para utilizarlos de manera local a nivel de un procedimiento, pero no para pasarlos de un procedimiento a otro, porque para ello declararíamos un tipo de dato, digamos "no anónimo": String, Integer, Cliente, Persona, etc.

    Tipos anónimos (Visual Basic)

    Definición de tipos anónimos (Visual Basic)

    Cómo: Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos (Visual Basic)

    Inferencia de tipo de variable local (Visual Basic)

    Un saludo

    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 9 de febrero de 2018 15:56
    Moderador
  • El caso es que recojo el objeto anónimo en una función callback javascript y funciona correctamente.

    function getDato(dato){

           alert(dato.T);

    }

    viernes, 9 de febrero de 2018 23:32
  • "Joseba Rguez" escribió:

    > El caso es que recojo el objeto anónimo en una función callback
    > javascript y funciona correctamente.
    >
    > function getDato(dato){
    >    alert(dato.T);
    > }

    Entiendo que el argumento dato de la función getDato será del tipo Object de JavaScript, el cual podrá ser visto como una colección de propiedades, de ahí que puedas obtener el valor de la propiedad llamada T:

    alert(dato.T);

    Debes de tener en cuenta que una vez que tu función de Visual Basic llamada ObtenerDatos devuelve un valor, éste ya no es un tipo de dato anónimo, sino más bien un tipo de dato bien conocido como es System.Object, que es el tipo de dato del que heredan todos los tipos de datos .NET, incluidos los tipos anónimos.

    Insisto en que los tipos anónimos solamente son reconocidos dentro del propio procedimiento donde son creados y utilizados, en tu caso, solamente dentro de la función ObtenerDatos, pero en ningún caso serán reconocidos como tales desde fuera de dicha función, y menos desde fuera de tu ensamblado de Visual Basic, los cuales podrán ser reconocidos como tipos Object, si es que el lenguaje de programación externo lo reconoce como un tipo de dato Object, claro está.

    Tipos de datos (JavaScript)

    Tipos de datos y estructuras en JavaScript


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 10 de febrero de 2018 5:49
    Moderador
  • Entonces, en este caso, parece que es correcto para poder trabajar en javascript con un objeto con propiedades.

    La otra posibilidad sería enviar un array (matriz) de 3 posiciones pero lo veo menos elegante.

    o lo envío en un string con formato JSON y lo paso en javascript  por JSON.parse()?

    ¿qué opinas?



    sábado, 10 de febrero de 2018 7:46
  • "Joseba Rguez" preguntó:

    > Entonces, en este caso, parece que es correcto para poder trabajar
    > en javascript con un objeto con propiedades.
    >
    > La otra posibilidad sería enviar un array (matriz) de 3 posiciones
    > pero lo veo menos elegante.
    >
    > o lo envío en un string con formato JSON y lo paso en javascript  por JSON.parse()?
    >
    > ¿qué opinas?

    ¡Bueno! Toda esta conversación se inició para ver la posibilidad de que una función escrita en Visual Basic .NET pueda devolver un tipo de dato anónimo mediante un valor System.Object, por lo que la única manera que yo veo es que la función devuelva ese tipo de dato concreto: System.Object. Pero, ¡claro! Estamos hablando de unos simples valores alfanuméricos ("A", "B", "C") que se crean localmente mediante un tipo de dato anónimo.

    Ahora bien, si en lugar de esos simples valores dispones de una clase de datos más seria que describe una Persona, un Producto, un Cliente, etc., donde puede que necesites validar los valores de ciertas propiedades de la misma, pues lo mismo te deberías de olvidar de los tipos anónimos y hacer que esa función devuelva un valor String que contenga un objeto Json serializado con los datos de la clase concreta que vas a deserializar, o convertirlo en un objeto de JavaScript, mediante el método JSON.parse, por tanto, y ya que hablamos de un intercambio de información, pues lo mismo te resulta más conveniente utilizar Json que un simple objeto System.Object.

    Y en cuanto a que esto o aquello es más o menos "elegante", entiendo que tú puedes tener la función más "estrafalaria" del mundo y que haga correcta y eficazmente el trabajo para la que fue diseñada, por tanto, si hace bien su trabajo, ¿por qué regla de tres no va a ser "elegante"? :-))

    Un objeto Object o una matriz de valores alfanuméricos puede llegar a ser tan "elegante" como una cadena alfanumérica con formato Json. Otra cuestión diferente es que si necesitamos leer los datos de un objeto de una manera rápida y eficaz, con independencia del lenguaje de programación que se utilice para ello, pues puede ser que sea más recomendable en este caso utilizar Json.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    sábado, 10 de febrero de 2018 19:06
    Moderador
  • Como me enrollo. Bueno, en la pregunta también iba "otras alternativas para hacerlo".

    Lo que busco es la manera más correcta de devolver los datos para este tipo de casos (siempre he oido que hay que evitar utilizar Object). Los datos en este caso son simples, pero es solo un ejemplo, podrían ser complejos también.

    Gracias por tus respuestas Enrique, me han orientado.

    Un saludo.

    lunes, 12 de febrero de 2018 7:31