C# 在PowerShell cmdlet参数中声明get访问器

C# 在PowerShell cmdlet参数中声明get访问器,c#,powershell,properties,parameters,pipeline,C#,Powershell,Properties,Parameters,Pipeline,根据: “必须在公共非静态字段或 属性。应在属性上声明参数。属性 必须具有公共集访问器,并且如果值为或 如果指定ValueFromPipelineByPropertyName关键字,则属性 必须具有公共get访问器。“ 为什么我必须在cmdletvaluefrompippeline参数中声明get访问器?据我所知,PowerShell只需要输入它们的值,而不需要读出它们。谢谢(顺便说一句,我只是对这种行为感到好奇:)。PowerShell读取标有ValueFromPipeline或ValueFr

根据:

“必须在公共非静态字段或 属性。应在属性上声明参数。属性 必须具有公共集访问器,并且如果值为或 如果指定ValueFromPipelineByPropertyName关键字,则属性 必须具有公共get访问器。“


为什么我必须在cmdlet
valuefrompippeline
参数中声明get访问器?据我所知,PowerShell只需要输入它们的值,而不需要读出它们。谢谢(顺便说一句,我只是对这种行为感到好奇:)。

PowerShell读取标有
ValueFromPipeline
ValueFromPipelineByPropertyName
的参数的默认值,以便在分配从中获得的新值之前进行备份

考虑以下cmdlet:

New-Post -Title <string>
Set-Post -InputObject <Post> -Title <string>
Set-Post
cmdlet的
Title
属性的get访问器上设置断点会导致以下堆栈跟踪:


如您所见,在将
Set Post
cmdlet上的
Title
属性与来自管道的对象上相应属性的值绑定的过程中,会调用
CmdletParameterBinderController.GetDefaultParameterValue
方法。

-1。虽然这是有逻辑的,但这不是PSH的工作原理。在cmdlet中,您可以调用
WriteObject
,将对象(或集合)传递到管道的下一步。@Richard我想您误解了我的观点。我说的不是阻止整个对象通过管道,而是自动分配同名参数。如果相应的属性为“只写”,PowerShell将无法检索分配给cmdlet参数的值。@Enricoampidoglio我现在肯定不明白。为什么需要PSH读取属性值?ByPropertyName要求将管道上对象的属性名称与cmdlet属性名称匹配。显然,名称匹配必须在指定cmdlet属性之前进行,即使如此,PSH仍然有从中读取属性值的管道对象。最后,这仍然与在管道上向前传递对象有关(cmdlet必须调用
cmdlet.WriteObject
)。@EnricoCampidoglio这里的问题始于您的断言“还必须能够将其值传递到管道中的下一个对象”:这不是真的。从cmdlet中向前传递的对象与输入管道对象没有关系:它们完全不同(cmdlet将同一对象显式传递给
WriteObject
)的情况除外)。我现在很困惑,但我倾向于同意richard more的观点。据我所知,参数不是像enrico说的那样传递到管道,而是通过writeobject传递的。这似乎是一个奇怪的要求。我只能假设它是一个实现人工制品(即泄漏抽象):在处理应用于参数属性的验证和类型转换时,遵循代码说明处理并不简单。另一方面,除了使用带有公共set和get的自动属性之外,我很少使用任何其他属性,因此无法想象在什么情况下我还需要其他任何东西。
New-Post -Title "Foo" | Set-Post