我正在尝试在Powershell中使用自定义方法和该方法内部的键值对创建一个自定义对象。
$mymethod= @{
MemberName = "mymethod"
MemberType = 'ScriptMethod'
Value = {'Test'}
Force = $true
}
Update-TypeData -TypeName 'Dummy' @mymethod
$test = [PsCustomObject][Ordered]@{PsTypeName = 'Dummy'}
因此,这创建了对象 $ test.mymethod()的值为“ Test”
我正在尝试如下创建:
$test.mymethod('key1')='value1'
$test.mymethod('key2')='value2'
有帮助吗?
答案 0 :(得分:2)
要一般性地回答问题(即使特定用例可能需要更简单的解决方案,如TheIncorrigible1's answer所示):
注意:在下面的代码中,我假设$test.mymethod('key1')='value1'
实际上是想让您$test.mymethod('key1')
返回 'value1'
,因为使用方法调用作为赋值的LHS没有意义。
# Define the class.
class Dummy {
[string] mymethod([string] $key) { return @{ key1='value1'; key2='value2' }[$key] }
}
# Instantiate it
$test = [Dummy]::new()
# Call the method
$test.mymethod('key2') # -> 'value2'
如果您确实要使用PowerShell's ETS (extended type system)(如您的问题)(这是PSv4-中的唯一选项,缺少通过Add-Type
嵌入的C#代码):
也许唯一的障碍是不知道如何为该方法定义一个参数(使用param()
块)以及如何访问在其上调用该方法的实例(使用$this
);两种技术如下所示:
# Define a type named 'Dummy' and attach a script method named 'mymethod'
$mymethod = @{
MemberName = 'mymethod'
MemberType = 'ScriptMethod'
# Note the use of param() to define the method parameter and
# the use of $this to access the instance at hand.
Value = { param([string] $key) $this.Dict[$key] }
Force = $true
}
Update-TypeData -TypeName 'Dummy' @mymethod
# Create a custom object and give it an ETS type name of 'Dummy', which
# makes the mymethod() method available.
$test = [PsCustomObject] @{ PsTypeName = 'Dummy'; Dict = @{ key1='value1'; key2='value2' } }
$test.mymethod('key2') # -> 'value2'
答案 1 :(得分:1)
要扩展@Ansgar Wiechers的评论,听起来您正在尝试重新创建字典,.NET的字典很多:
$test = [pscustomobject]@{
bar = [ordered]@{
}
}
实际情况:
$test.bar.Add('key1', 'value1')
$test.bar.Add('key2', 'value2')
输出:
> $test
>> bar
>> ---
>> {key1, key2}
> $test.bar
>> Name Value
>> ---- -----
>> key1 value1
>> key2 value2