在Metro应用程序中将数组从javascript传递到C#

atk*_*sch 8 javascript c# windows-8 windows-runtime

编辑:我找到了答案(在Tejs的帮助下); 见下文.


我正在使用HTML/Javascript开发Metro应用程序,以及一些基于C#的帮助程序库.一般来说,我在从Javascript调用C#方法方面取得了很大的成功,但我似乎无法通过数组(在我的特定情况下,字符串数组)来工作.传递单个字符串可以正常工作.

我的代码是这样的:

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

然后,在C#中:

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

问题是方法"Foo"获得一个具有正确长度的数组(所以在上面的例子中为3),但所有元素都是空的.我也试过这个:

public static string Foo(object[] strings) {
...
Run Code Online (Sandbox Code Playgroud)

这也没有用 - 再次,数组是正确的大小,但所有元素都是null.

我试过传递字符串文字,字符串变量,在javascript中使用"new Array(...)",将"Foo"的签名更改为"params string []"和"params object []",都无济于事.

由于传递单个字符串工作正常,我可能可以通过一些hackery来解决这个问题......但看起来这应该可行.对我来说,这个数组以正确的大小传入(即,正在进行编组的任何事情都知道关于javascript数组结构的SOMETHING)并且内容没有被填充,这对我来说似乎很奇怪.

atk*_*sch 1

诀窍是使用 IEnumerable 而不是 string[]。因此,将我的原始代码替换为以下内容:

public sealed class MyClass {
    public static string Foo(IEnumerable<string> strings) {
        // do stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您需要传递字符串以外的数组,IEnumerable 也可以工作。

感谢@Tejs 的灵感!