我正在使用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)并且内容没有被填充,这对我来说似乎很奇怪。
答案 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的灵感!