2012-05-16 6 views
8

EDIT: Ich habe eine Antwort gefunden (mit Hilfe von Tejs); siehe unten.Übergeben Array von Javascript zu C# in Metro-App


Ich entwickle ein Metro-App HTML/Javascript verwenden, zusammen mit einigen C Hilfsbibliotheken # -basierte. Im Allgemeinen habe ich eine Menge Erfolg beim Aufrufen von C# -Methoden aus Javascript, aber ich kann nicht scheinen, Arrays (in meinem speziellen Fall Arrays von Strings) zu passieren. Das Übergeben einzelner Strings funktioniert ohne Probleme.

Mein Code ist so etwas wie dieses:

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

Dann in C#:

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

Das Problem ist, dass die Methode "Foo" ein Array mit der richtigen Länge wird (so in der oben Beispiel 3, aber alle Elemente sind leer. Ich habe es auch versucht:

Das hat auch nicht funktioniert - wieder, das Array hatte die richtige Größe, aber alle Elemente waren null.

Ich habe versucht String-Literale, String-Variablen übergeben, mit "neues Array (...)" in Javascript, Ändern der Signatur von "Foo" in "Params String []" und "Params-Objekt []", alles vergebens.

Da die Passage einzelner Strings gut funktioniert, kann ich das wohl mit etwas Hacker umgehen ... aber es scheint wirklich, als würde das funktionieren. Es scheint mir wirklich komisch, dass das Array in der richtigen Größe übergeben wird (d. H. Was auch immer das Marshalling tut, weiß ETWAS über die Javascript-Array-Struktur) und dennoch werden die Inhalte nicht gefüllt.

+0

Was passiert, wenn Sie String-Literale anstelle von 'string1',' string2' und 'string3' verwenden? – Tejs

+0

Gleiches Ergebnis - der C# -Code erhält immer noch nur leere Zeichenfolgen. – atkretsch

+0

Was ist mit 'new String (" Hallo Welt ")' für ein Array-Element? Vielleicht kann die WinRT nicht davon ausgehen, dass das Objekt eine Zeichenkette ist – Tejs

Antwort

1

Der Trick besteht darin, IEnumerable anstelle von string [] zu verwenden. So ersetzen meiner ursprünglichen Code durch den folgenden:

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

Beachten Sie auch, dass IEnumerable funktioniert auch, wenn Sie Arrays von etwas passieren müssen andere als Strings.

Danke @Tejs für die Inspiration!

2

Die Lösung für Ihr Problem ist sehr einfach, es braucht nur ein scharfes Auge, um es zu bemerken. Zuerst müssen Sie in der Tatsache, dass in C# (und möglicherweise JavaScript aktivieren, als auch), dass Sie nicht ein Array von Arrays haben kann (zumindest nicht so, wie Sie es tun!) Also in Ihrem javascript:

var Ergebnis = MyLibrary.MyNamespace.MyClass.foo ([Zeichenfolge1, Zeichenfolge2, Zeichenfolge3]);

und in C#:

public static string Foo (string [] Strings) {

Sie mehrere Argumente von String-Arrays passieren gehen zu müssen, die Methode Foo lassen , etwa so:

public static String Foo (String [] Zeichenfolge1, String [] Zeichenfolge2, String [] string3) {

Aber wenn Sie ein Array von Arrays erstellen möchten, werden Sie eine Liste Konstruktor verwenden müssen:

public static string Foo (List < string []> Strings) {

Aber das Problem mit der obigen Antwort ist, dass Javascript List-Konstruktor nicht hat, also würde ich vorschlagen, mit der ersten Lösung zu gehen, es sei denn, Sie können einen Weg finden, diesen zu beheben!

Verwandte Themen