# GetMethod

检索方法的实现函数.

    Method := GetMethod(Value , Name, ParamCount)

## 参数

Value

  类型: Any

  除了 ComObject 之外的任何类型的任何值.

Name

  类型: 字符串

  要检索的方法的名称.

  省略此参数, 对 Value 本身进行验证, 如果成功, 则返回 Value.

ParamCount
  类型: 整数

  将被传递给方法或函数的参数数量. 如果指定, 可以查询该方法的 MinParams, MaxParams 和 IsVariadic 属性, 以验证它是否可以接受这个参数指定的数量. 如果这些属性不存在, 参数数就不会被验证.

  这个计数不应该包括隐含的 `this` 参数.

  如果省略(或者参数数没有被验证), 则会对 Call 方法进行基本检查, 以验证该对象可调用的.

## 返回值

类型: 函数对象

函数返回包含方法实现的函数对象, 如果省略了 Name, 则返回 Value 本身.

## 错误

如果没有找到该方法或在没有调用属性获取器(getter) 的情况下不能被检索到, 则抛出 MethodError.

如果尝试验证, 可能会因为查询方法的属性而抛出异常. 如果验证失败, 则抛出 ValueError 或 MethodError.

## 备注

方法可以通过以下方式来定义:

- 一个具有 call 访问函数的动态属性. 这包括:
  - 任何由类中的方法定义创建的属性.
  - 通过向 DefineProp 传递 `{Call: fn}` 这样的描述符创建的任何属性, 其中 fn 实现了方法.
  - 任何预定义/内置的方法.
- 对象或其基对象之一的自有值属性, 其中的值是一个函数对象.
- 一个带有 getter 的动态属性, 它返回一个函数对象. GetMethod 不支持这种情况.
- 在 __Call 元函数中进行处理. 这种方式实现的方法不能被检测到, 甚至可能没有对应的函数对象, 所以不受 GetMethod 的支持.

当调用函数对象时, 需要为通常隐藏的 this 参数提供一个值. 例如, `Method(Value, Parameters*)`.

尽管 GetMethod 的标准实现有上述限制, 但如果使用 `Value.GetMethod(Name)` 而不是 `GetMethod(Value, Name)`, 对象 Value 可以定义自己的 GetMethod 的实现.

`GetMethod(Value, "Call", N)` 不等同于 `GetMethod(Value,, N)`, 因为 Call 方法将函数对象本身作为参数, 而且其用法可能与 Value 的用法不同. 例如, `Func.Prototype.Call` 是一个单一的方法, 适用于所有内置和用户定义的函数, 因此必须接受任何数量的参数.

## 相关

Objects, HasMethod, HasBase, HasProp

## 示例

检索并报告有关 GetMethod 方法的信息.

    method := GetMethod({}, "GetMethod")  ; 这也是一种方法.
    MsgBox method.MaxParams  ; 接受 2 个参数, 包括 'this'.
    MsgBox method = GetMethod  ; 在这种情况下, 实际上是同一个对象.

dftg