8

編集:私は答えを見つけました(Tejsの助けを借りて); 下記参照。


C# ベースのヘルパー ライブラリと共に、HTML/Javascript を使用して 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 配列構造について何かを知っています) にもかかわらず、内容が入力されていません。

4

2 に答える 2

2

あなたの問題の解決策は非常に簡単です。それに気付くには鋭い目が必要です。まず、C# (およびおそらく JavaScript も同様) では、配列の配列を持つことができないという事実を考慮する必要があります (少なくとも、あなたがやっている方法とは異なります!) したがって、JavaScript では:

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

そしてあなたのC#で:

public static string Foo(文字列[] 文字列) {

次のように、メソッド Foo に文字列配列のいくつかの引数を渡す必要があります。

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

ただし、配列の配列を作成する場合は、List コンストラクターを使用する必要があります。

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

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

于 2012-05-16T18:50:34.617 に答える
1

トリックは、string[] の代わりに IEnumerable を使用することです。したがって、元のコードを次のコードに置き換えます。

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

また、文字列以外の配列を渡す必要がある場合は、IEnumerable も機能することに注意してください。

インスピレーションをくれた@Tejsに感謝します!

于 2012-05-17T16:59:42.163 に答える