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
相关产品推荐
相关产品推荐

