8

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


我正在使用 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) {
...

这也不起作用 - 同样,数组的大小是正确的,但所有元素都是空的。

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

由于传递单个字符串工作正常,我可能可以通过一些黑客来解决这个问题......但看起来这确实应该工作。对我来说,数组以正确的大小传入似乎真的很奇怪(即,无论做什么封送处理都知道有关 javascript 数组结构的某些信息),但内容却没有被填充。

4

2 回答 2

2

您的问题的解决方案非常简单,只需要敏锐的眼光就能注意到它。首先,您必须接受这样一个事实,即在 C#(也很可能是 javascript)中,您不能拥有数组数组(至少不像您的做法!)所以在您的 javascript 中:

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

在你的 C# 中:

公共静态字符串 Foo(string[] 字符串) {

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

公共静态字符串 Foo(string[] string1, string[] string2, string[] string3) {

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

公共静态字符串 Foo(List< string[] > strings) {

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

于 2012-05-16T18:50:34.617 回答
1

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

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

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

感谢@Tejs 的启发!

于 2012-05-17T16:59:42.163 回答