2012-05-16 11 views
8

EDIT: He encontrado una respuesta (con la ayuda de Tejs); vea abajo.Pase la matriz de javascript a C# en la aplicación Metro


Estoy desarrollando una aplicación de Metro utilizando HTML/Javascript, junto con algunas bibliotecas de ayuda basadas en C#. En términos generales, estoy teniendo mucho éxito al invocar los métodos de C# de Javascript, pero parece que no puedo hacer que las matrices que pasan (en mi caso específico, las matrices de cadenas) funcionen. Pasar cadenas individuales funciona sin problemas.

Mi código es algo como esto:

// in javascript project 
var string1 = ...; 
var string2 = ...; 
var string3 = ...; 
var result = MyLibrary.MyNamespace.MyClass.foo([string1, string2, string3]); 

Luego, en C#:

// in C# project 
public sealed class MyClass { 
    public static string Foo(string[] strings) { 
     // do stuff... 
    } 
} 

El problema es que el método de "Foo" recibe una matriz con la longitud correcta (lo que en el ejemplo anterior, 3), pero todos los elementos están vacíos. También probé esto:

public static string Foo(object[] strings) { 
... 

que no funcionaron bien - de nuevo, la matriz era del tamaño correcto, pero todos los elementos eran nulos.

He intentado pasar literales de cadena, variables de cadena, usando "new Array (...)" en javascript, cambiando la firma de "Foo" a "params string []" y "params object []", todo fue en vano.

Como pasar cadenas individuales funciona bien, probablemente pueda solucionar esto con algunos hackers ... pero parece que esto debería funcionar. Me parece realmente extraño que la matriz se transfiera como el tamaño correcto (es decir, lo que sea que esté haciendo la clasificación sepa ALGO sobre la estructura de la matriz de JavaScript) y, sin embargo, los contenidos no se llenan.

+0

¿Qué sucede cuando se usan literales de cadena en lugar de 'cadena1',' cadena2' y 'cadena3'? – Tejs

+0

Mismo resultado: el código C# solo recibe cadenas vacías. – atkretsch

+0

¿Qué pasa con 'new String (" Hello World ")' para un elemento de matriz? Tal vez el WinRT no puede asumir que el objeto es una cadena – Tejs

Respuesta

1

El truco es usar IEnumerable en lugar de string []. Así que reemplazar mi código original con lo siguiente:

public sealed class MyClass { 
    public static string Foo(IEnumerable<string> strings) { 
     // do stuff... 
    } 
} 

También tenga en cuenta que IEnumerable funciona también, si tiene que pasar matrices de algo distinto de cuerdas.

Gracias @Tejs por la inspiración!

2

La solución a su problema es muy simple, solo toma un ojo agudo para darse cuenta. primer lugar hay que tomar en el hecho de que en C# (y muy posiblemente Javascript, también) que no se puede tener una matriz de matrices (al menos no le gusta cómo lo está haciendo!) Así que en su javascript:

var result = MyLibrary.MyNamespace.MyClass.foo ([cadena1, cadena2, cadena3]);

y en su C#:

public static string Foo (String [] cuerdas) {

vas a tener que dejar que el método de Foo pasar varios argumentos de las matrices de cadenas , así:

public static string Foo (string [] cadena1, string [] string2, string [] string3) {

Pero si desea crear una matriz de matrices, que se va a tener que utilizar un constructor de lista:

public static string Foo (Lista < string []> cuerdas) {

Pero el problema con la respuesta anterior es que Javascript no tiene el constructor de listas, por lo que le sugiero ir con la primera solución, ¡a menos que pueda encontrar una manera de arreglar esta!

Cuestiones relacionadas