2012-05-16 2 views
8

EDIT:私は答えを見つけました(Tejsの助けを借りて)。下記参照。メトロアプリのjavascriptからC#に配列を渡す


私は、HTML/JavascriptといくつかのC#ベースのヘルパーライブラリを使用してMetroアプリケーションを開発しています。一般的に私はJavascriptからC#メソッドを呼び出すことに成功していますが、配列を渡すことはできません。個々の文字列を渡すことは問題なく動作します。

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

その後、C#で:

私のコードは次のようなものである

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

問題は、メソッド "foo" がでそう(正しい長さを持つ配列を取得していることです上記の例、3)、すべての要素は空です。私も試してみましたこの:動作しませんでした

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

どちらか - もう一度、配列が正しいサイズだったが、すべての要素がnullでした。

javascriptで "new Array(...)"を使って文字列リテラル、文字列変数を渡してみました。 "Foo"の署名を "params string []"と "params object []"に変更しました。すべて無駄に。

個々の文字列を渡すとうまくいくので、私はおそらくいくつかのハッカーでこれを回避することができます...しかし実際にはうまくいくはずです。配列が適切なサイズ(つまり、マーシャリングを行っているものがjavascript配列構造について何かを知っているもの)として渡されているにもかかわらず、コンテンツにデータが取り込まれていないというのは本当に奇妙なようです。

+0

'string1'、' string2'、 'string3'の代わりに文字列リテラルを使用するとどうなりますか? – Tejs

+0

同じ結果 - C#コードでも空文字列しか受け取られません。 – atkretsch

+0

配列項目の ''新しい文字列( "Hello World") 'はどうですか?おそらく、WinRTはオブジェクトが文字列であると仮定することはできません – Tejs

答えて

1

トリックは、string []の代わりにIEnumerableを使用することです。だから、次のように私の元のコードを置き換える:あなたは、文字列以外の配列を渡す必要がある場合

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

はまた、IEnumerableをあまりにも動作することに注意してください。

感謝のために@Tejs!

2

あなたの問題に対する解決方法は非常に簡単です。それに気づくには鋭い目が必要です。 まず、あなたは、配列の配列を持つことができないのC#(と同様に非常に可能性ジャバスクリプト)に(少なくとも、あなたがそれをやっている方法を好きではない!)ということでなければならない をだからあなたのJavaScriptで:

var result = MyLibrary.MyNamespace.MyClass。foo([string1、string2、string3]);

とあなたのC#で:

パブリック静的な文字列はFoo(文字列[]の文字列){

あなたはメソッドfooが文字列配列のいくつかの引数を渡すようにする必要があるとしています次のようになります。

public static string Foo(文字列[]文字列1、文字列[]文字列2、文字列[]文字列3){

しかし、あなたは、配列の配列を作成したい場合は、リストのコンストラクタを使用する必要があるとしている。

パブリック静的文字列はFoo(一覧<文字列[]>の文字列){

しかし、上記の答えの問題は、JavascriptにListコンストラクタがないことです。この問題を解決する方法が見つからない限り、最初の解決方法をお勧めします。

関連する問題