You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell自定义类遇MethodException:找不到Add方法重载问题

PowerShell自定义类生成指定JSON结构的解决方案

错误原因

你遇到的MethodException是因为Hashtable的Add()方法要求传入两个参数(键和对应的值),而你直接传入了一个字符串数组,参数数量不匹配,导致找不到对应的方法重载。List的Add()方法只需要单个元素,所以替换成List能运行,但无法生成你需要的键值对JSON结构。

解决方案

推荐两种实现方式,都能生成你需要的JSON结构:

方案1:使用嵌套自定义类(推荐,类型更安全)

通过定义嵌套类来明确结构,填充数据时更直观,转换JSON也能完美匹配需求:

# 定义Extensions的结构类
class ExtensionsConfig {
    [string[]]$names
    [bool]$scheduled
    [string[]]$features
}

# 主API请求类
class ApiRequest {
    [ExtensionsConfig]$extensions

    # 构造函数初始化硬编码值
    ApiRequest() {
        $this.extensions = [ExtensionsConfig]::new()
        $this.extensions.scheduled = $true
        $this.extensions.features = @("AUTO_PROTECT")
    }

    # 填充扩展名数组的方法
    [void]AddExtensions([string[]]$extensionNames) {
        $this.extensions.names = $extensionNames
    }
}

# 使用示例
$requestObj = [ApiRequest]::new()
$requestObj.AddExtensions(@("txt", "exe", "doc"))

# 转换为JSON
$requestObj | ConvertTo-Json -Depth 3

执行后生成的JSON结构:

{
    "extensions": {
        "names": [
            "txt",
            "exe",
            "doc"
        ],
        "scheduled": true,
        "features": [
            "AUTO_PROTECT"
        ]
    }
}

方案2:保留Hashtable但修正赋值逻辑

如果坚持使用Hashtable,不需要调用Add()方法,直接为指定键赋值即可:

class ApiRequest {
    [hashtable]$extensions

    ApiRequest() {
        # 初始化时设置硬编码的键值对
        $this.extensions = @{
            scheduled = $true
            features = @("AUTO_PROTECT")
        }
    }

    [void]AddExtensions([string[]]$extensionNames) {
        # 直接给names键赋值,而非调用Add方法
        $this.extensions["names"] = $extensionNames
    }
}

# 使用示例
$requestObj = [ApiRequest]::new()
$requestObj.AddExtensions(@("txt", "exe", "doc"))

$requestObj | ConvertTo-Json -Depth 3

这种方式同样能生成你需要的JSON结构,避免了HashtableAdd()方法的参数错误问题。

内容的提问来源于stack exchange,提问作者Douda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:16:36