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

时间:2012-05-16 18:00:45

标签: c# javascript 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]);

然后,在C#中:

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

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

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

这也不起作用 - 再次,数组的大小正确,但所有元素都为空。

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

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

2 个答案:

答案 0 :(得分:2)

您的问题的解决方案非常简单,只需要敏锐的眼睛注意它。 首先你要注意的事实是,在C#(以及很可能是javascript)中,你不能拥有一个数组数组(至少不像你在做什么!) 所以在你的javascript:

  

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

并在你的C#中:

  

public static string Foo(string [] strings){

你需要让方法Foo传递几个字符串数组的参数,如下所示:

  

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

但是如果你想创建一个数组数组,你将不得不使用List构造函数:

  

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

但上面答案的问题是Javascript没有List构造函数,所以我建议使用第一个解决方案,除非你能找到解决这个问题的方法!

答案 1 :(得分:1)

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

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

另请注意,IEnumerable也可以,如果你需要传递除字符串以外的其他数组。

感谢@Tejs的灵感!