System.Collections.ArrayList
是ComVisible(true)
。它包含三个IndexOf
重载(请参阅here):
public virtual int IndexOf(Object value)
public virtual int IndexOf(Object value, int startIndex)
public virtual int IndexOf(Object value, int startIndex, int count)
从VBScript中,只能访问第二个重载:
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
'oList.IndexOf "foo" 'Error: Invalid procedure call or argument: 'IndexOf'
oList.IndexOf "foo", 0
'oList.IndexOf "foo", 0, 1 'Error: Wrong number of arguments or property assignment was not valid: 'IndexOf'
在'Overloading a method in com visible dll' Hans Passant解释说 程序集中存在重载方法,但是从脚本中无法得到它们 调度并因此称呼他们。这似乎意味着一种方法可能会通过它。
答案 0 :(得分:2)
重载具有编号别名:
>> Set al = CreateObject("System.Collections.ArrayList")
>> al.Add "poo"
>> al.Add "foo"
>> WScript.Echo al.IndexOf("poo", 0)
>>
0
>> WScript.Echo al.IndexOf("poo", 1)
>>
-1
>> WScript.Echo al.IndexOf_1("foo")
>>
Error Number: 438
Error Description: Object doesn't support this property or method
>> WScript.Echo al.IndexOf_2("foo")
>>
Error Number: 5
Error Description: Invalid procedure call or argument
>> WScript.Echo al.IndexOf_3("foo")
>>
1
>>
我用反复试验弄清楚了;可能有文档或内省工具用于更科学的方法。
答案 1 :(得分:2)
简短回答:所有人。
让我们分析@hans-passant写的内容;
Answer至Overloading a method in com visible dll
COM不支持成员重载,每个名称必须是唯一的。IDispatch::GetIDsOfNames()
不可避免的副作用。脚本解释器用于将脚本代码中使用的“写入”转换为dispid的函数。该方法仍然存在,没有办法让GetIDsOfNames()
返回其dispid。 类型库导出器通过重命名重载方法解决了这个问题,它将是Write_2()
。
分为两部分
IDispatch::GetIDsOfNames()
它没有说它们不可用,相反它们已被重命名,以避免IDispatch::GetIDsOfNames()
在为方法名称分配DISPID
时所具有的唯一性约束。
因此,所有三个重载都可以使用以下格式重命名
oList.IndexOf
oList.IndexOf_2
oList.IndexOf_3
注意:没有
IndexOf_1
,因为第一次重载始终采用原始方法名称,后续重载从_2
开始。 < / p>
根据类型库导出器重命名重载的方式将取决于哪一个采用哪一组参数,解决这个问题的唯一方法就是试错。
快速尝试测试
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
oList.Add "bar"
oList.Add "foo"
WScript.Echo oList.IndexOf("foo", 0)
WScript.Echo oList.IndexOf_2("foo", 0, 1)
WScript.Echo oList.IndexOf_3("foo")
输出:
1
-1
1
如果我们回到原来的例子
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
'oList.IndexOf "foo" 'Error: Invalid procedure call or argument: 'IndexOf'
oList.IndexOf "foo", 0
'oList.IndexOf "foo", 0, 1 'Error: Wrong number of arguments or property assignment was not valid: 'IndexOf'
由于VBScript如何评估方法签名,语句1和3因错误而失败。上例中的正确签名接受两个参数,因此第一个语句;
oList.IndexOf "foo"
将失败,因为唯一匹配的签名有两个参数,而不是错误;
无效的过程调用或参数:'IndexOf'
第三个陈述
oList.IndexOf "foo", 0, 1
包含一个参数,然后是预期的签名,所以不是找不到匹配,而是找到一个但报告;
错误的参数或属性赋值数无效:'IndexOf'
因为参数的数量超过方法签名IndexOf(arg, arg)
的预期值。