@@ -51,22 +51,25 @@ static PipelineEmitter()
5151
5252 public PipelineEmitter ( PSCmdlet cmdlet ) => _cmdlet = cmdlet ;
5353
54- public void Invoke ( T value ) => _cmdlet . WriteObject ( value , enumerateCollection : false ) ;
55-
56- public void Invoke ( T value , object ? instance )
54+ private static PSObject AsPSObject ( object obj , bool storeTypeNameAndInstanceMembersLocally )
5755 {
58- PSObject pso ;
59- if ( s_asPSObject is null || s_setHidden is null )
56+ if ( s_asPSObject is null )
6057 {
61- pso = PSObject . AsPSObject ( value ) ;
62- pso . Properties . Add ( new PSNoteProperty ( "__ce_Instance" , instance ) ) ;
63- _cmdlet . WriteObject ( pso , enumerateCollection : false ) ;
64- return ;
58+ return PSObject . AsPSObject ( obj ) ;
6559 }
6660
67- pso = s_asPSObject ( value , true ) ;
61+ return s_asPSObject ( obj , storeTypeNameAndInstanceMembersLocally ) ;
62+ }
63+
64+ public void Invoke ( T value ) => _cmdlet . WriteObject ( value , enumerateCollection : false ) ;
65+
66+ public void Invoke ( T value , object ? instance )
67+ {
68+ // Avoid saving to the PSObject member resurrection table if possible as
69+ // .NET caches `MemberInfo` objects.
70+ PSObject pso = AsPSObject ( value ! , storeTypeNameAndInstanceMembersLocally : true ) ;
6871 PSNoteProperty instanceProp = new ( "__ce_Instance" , instance ) ;
69- s_setHidden ( instanceProp ) ;
72+ s_setHidden ? . Invoke ( instanceProp ) ;
7073 pso . Properties . Add ( instanceProp ) ;
7174 _cmdlet . WriteObject ( pso , enumerateCollection : false ) ;
7275 }
0 commit comments