【发布时间】:2011-12-05 11:56:39
【问题描述】:
我有一个 .NET 类,它包含一个简单的字符串数组,可通过访问器方法获得,如下所示;
namespace Foo.Bar {
[ComVisible(true)]
[Guid("642279A0-85D4-4c7a-AEF5-A9FAA4BE85E5")]
public class MyClass {
private string[] _myArray;
public MyClass() { }
public MyClass(string[] myArray) {
_myArray = myArray;
}
public string[] MyArray {
get { return _myArray; }
}
}
}
我使用 Classic ASP 使用这个类;
Dim foo
Set foo = Server.CreateObject("Foo.Bar.MyClass")
if IsArray(foo.MyArray) then Response.Write("IsArray") & "<br />"
Response.Write(typename(foo.MyArray)) & "<br />"
Response.Write(UBound(foo.MyArray)) & "<br />"
这会导致;
IsArray
String()
1
但是,当我尝试使用;访问数组的内容时,
Response.Write(foo.MyArray(0)) & "<br />"
我明白了;
Microsoft VBScript 运行时 (0x800A01C2) 参数数量错误或 无效的属性分配:'MyArray'
非常感谢任何帮助。
编辑这是为了在消化给出的答案后提供更多信息(谢谢)
将 MyArray 属性的实现更改为;
public object[] MyArray {
get { return (object[])_myArray; }
}
然后我得到以下错误,
Microsoft VBScript 运行时 (0x800A000D) 类型不匹配:'MyArray'
所以我尝试将每个字符串单独转换为一个对象;
public object[] MyArray {
get {
object[] tmp = new object[_myArray.Count()];
for (int x = 0; x < _myArray.Count(); x++) {
tmp[x] = (object)_myArray[x];
}
return tmp;
}
}
那我又来了,
Microsoft VBScript 运行时 (0x800A01C2) 参数数量错误或 无效的属性分配:'MyArray'
编辑在How to correctly marshal VB-Script arrays to and from a COM component written in C#的帮助下的最终解决方案
C#
public object MyArray {
get { return _myArray.Cast<object>().ToArray(); }
}
VBScript
Dim foo
Set foo = Server.CreateObject("Foo.Bar.MyClass")
bar = foo.MyArray
Response.Write bar(0)
关键是公开object 而不是object[],并且正如AnthonyWJones 建议的那样,在使用之前将数组分配给一个变量。
再次感谢。
【问题讨论】:
-
这给了我想要的答案。只需使用 System.Linq 添加即可使演员工作
标签: asp.net com asp-classic