可以从VBScript访问哪种方法重载?

时间:2016-05-03 10:15:54

标签: c# vbscript overloading

System.Collections.ArrayListComVisible(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解释说 程序集中存在重载方法,但是从脚本中无法得到它们 调度并因此称呼他们。这似乎意味着一种方法可能会通过它。

  • 我可以从ArrayList源(或其他地方)确定哪些方法可以访问?有哪些规则来管理这个选择过程?
  • 为什么第一种情况和第三种情况的错误消息不同?

2 个答案:

答案 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写的内容;

  

AnswerOverloading a method in com visible dll
   COM不支持成员重载,每个名称必须是唯一的。 IDispatch::GetIDsOfNames()不可避免的副作用。脚本解释器用于将脚本代码中使用的“写入”转换为dispid的函数。该方法仍然存在,没有办法让GetIDsOfNames()返回其dispid。 类型库导出器通过重命名重载方法解决了这个问题,它将是Write_2()

分为两部分

  1. 解释IDispatch::GetIDsOfNames()
  2. 的行为
  3. 类型库导出器如何解决唯一性问题。
  4. 它没有说它们不可用,相反它们已被重命名,以避免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)的预期值。

    有用的链接