From ac26edd98c7d7a8bd0aca26a3c1e3b53c86a6ee8 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 27 Oct 2023 00:51:35 +0100 Subject: [PATCH 1/8] Return no children if cannot expand --- src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 22c5626..2c18b94 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -205,6 +205,11 @@ private static bool IsBasicType(object value) public IEnumerable GetChildren(object forObject) { + if(!this.CanExpand(forObject)) + { + return Enumerable.Empty(); + } + if (forObject is CachedMemberResult p) { if (p.IsCollection) From 0dd99a12a337210d437f9e0e6ca32fd294661a2e Mon Sep 17 00:00:00 2001 From: tznind Date: Fri, 27 Oct 2023 01:00:18 +0100 Subject: [PATCH 2/8] Only ask for public instance members --- src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 2c18b94..4a8174b 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -205,7 +205,7 @@ private static bool IsBasicType(object value) public IEnumerable GetChildren(object forObject) { - if(!this.CanExpand(forObject)) + if(forObject ==null || !this.CanExpand(forObject)) { return Enumerable.Empty(); } @@ -227,7 +227,7 @@ public IEnumerable GetChildren(object forObject) List children = new List(); - foreach (var member in forObject.GetType().GetMembers().OrderBy(m => m.Name)) + foreach (var member in forObject.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public).OrderBy(m => m.Name)) { if (member is PropertyInfo prop) { From 749376115419d6ef80741c64b6d8d784b763e0e6 Mon Sep 17 00:00:00 2001 From: tznind Date: Sun, 17 Mar 2024 09:06:54 +0000 Subject: [PATCH 3/8] Do not get BaseObject when it is PSCustomObject - WIP --- .../ShowObjectView.cs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 4a8174b..4d1a5b7 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -9,10 +9,9 @@ using System.Linq; using System.Management.Automation; using System.Reflection; +using System.Text; using System.Text.RegularExpressions; - using OutGridView.Models; - using Terminal.Gui; using Terminal.Gui.Trees; @@ -178,6 +177,16 @@ private string AspectGetter(object toRender) { return fsi.Name; } + if(toRender is PSObject o) + { + var str = ""; + foreach(var prop in o.Properties) + { + str += $"{prop.Name}:{prop.Value}"; + } + return str; + } + return toRender.ToString(); } @@ -272,7 +281,7 @@ internal static void Run(List objects, ApplicationData applicationData try { - window = new ShowObjectView(objects.Select(p => p.BaseObject).ToList(), applicationData); + window = new ShowObjectView(objects.Select(SelectObject).ToList(), applicationData); Application.Top.Add(window); Application.Run(); } @@ -283,6 +292,16 @@ internal static void Run(List objects, ApplicationData applicationData } } + private static object SelectObject(PSObject obj) + { + if(obj.BaseObject is PSCustomObject) + { + return obj; + } + + return obj.BaseObject; + } + sealed class CachedMemberResultElement { public int Index; From 365f60a6934a6fe9036cfec29241c06236e50a66 Mon Sep 17 00:00:00 2001 From: tznind Date: Sun, 17 Mar 2024 09:43:56 +0000 Subject: [PATCH 4/8] Improve cache layer - Move to new folder - Make interface and abstract base with generics - Add implementation for PSObject@ --- .../ShowObjectView.cs | 161 +++--------------- .../TreeNodeCaching/CachedMemberResult.cs | 46 +++++ .../TreeNodeCaching/CachedMemberResultBase.cs | 83 +++++++++ .../CachedMemberResultElement.cs | 34 ++++ .../CachedPSObjectMemberResult.cs | 28 +++ .../TreeNodeCaching/ICachedMemberResult.cs | 15 ++ 6 files changed, 231 insertions(+), 136 deletions(-) create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/ICachedMemberResult.cs diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 4d1a5b7..19e9263 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -2,7 +2,6 @@ // Licensed under the MIT License. using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -14,10 +13,11 @@ using OutGridView.Models; using Terminal.Gui; using Terminal.Gui.Trees; +using OutGridView.Cmdlet.TreeNodeCaching; namespace OutGridView.Cmdlet { - internal sealed class ShowObjectView : Window, ITreeBuilder + internal sealed partial class ShowObjectView : Window, ITreeBuilder { private readonly TreeView tree; private readonly RegexTreeViewTextFilter filter; @@ -146,7 +146,7 @@ private void SelectionChanged(object sender, SelectionChangedEventArgs e { var selectedValue = e.NewValue; - if (selectedValue is CachedMemberResult cmr) + if (selectedValue is ICachedMemberResult cmr) { selectedValue = cmr.Value; } @@ -179,12 +179,7 @@ private string AspectGetter(object toRender) } if(toRender is PSObject o) { - var str = ""; - foreach(var prop in o.Properties) - { - str += $"{prop.Name}:{prop.Value}"; - } - return str; + return o.ToString(); } @@ -198,7 +193,7 @@ private bool IsRootObject(object o) public bool CanExpand(object toExpand) { - if (toExpand is CachedMemberResult p) + if (toExpand is ICachedMemberResult p) { return IsBasicType(p?.Value); } @@ -219,7 +214,7 @@ public IEnumerable GetChildren(object forObject) return Enumerable.Empty(); } - if (forObject is CachedMemberResult p) + if (forObject is ICachedMemberResult p) { if (p.IsCollection) { @@ -234,6 +229,11 @@ public IEnumerable GetChildren(object forObject) return GetChildren(e.Value); } + if(forObject is PSObject pso) + { + return GetPSObjectChildren(pso); + } + List children = new List(); foreach (var member in forObject.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public).OrderBy(m => m.Name)) @@ -260,6 +260,20 @@ public IEnumerable GetChildren(object forObject) return children; } + /// + /// We only deal with PSObject when there is no native type (e.g. Process). + /// For example when the PSObject.BaseObject is a PSCustomObject. + /// + /// + /// + public IEnumerable GetPSObjectChildren(PSObject pso) + { + foreach(var m in pso.Members.Where(m=>m.IsInstance)) + { + yield return new CachedPSObjectMemberResult(pso, m); + } + } + private static IEnumerable GetExtraChildren(object forObject) { if (forObject is DirectoryInfo dir) @@ -302,131 +316,6 @@ private static object SelectObject(PSObject obj) return obj.BaseObject; } - sealed class CachedMemberResultElement - { - public int Index; - public object Value; - - private string representation; - - public CachedMemberResultElement(object value, int index) - { - Index = index; - Value = value; - - try - { - representation = Value?.ToString() ?? "Null"; - } - catch (Exception) - { - Value = representation = "Unavailable"; - } - } - public override string ToString() - { - return $"[{Index}]: {representation}]"; - } - } - - sealed class CachedMemberResult - { - public MemberInfo Member; - public object Value; - public object Parent; - private string representation; - private List valueAsList; - - - public bool IsCollection => valueAsList != null; - public IReadOnlyCollection Elements => valueAsList?.AsReadOnly(); - - public CachedMemberResult(object parent, MemberInfo mem) - { - Parent = parent; - Member = mem; - - try - { - if (mem is PropertyInfo p) - { - Value = p.GetValue(parent); - } - else if (mem is FieldInfo f) - { - Value = f.GetValue(parent); - } - else - { - throw new NotSupportedException($"Unknown {nameof(MemberInfo)} Type"); - } - - representation = ValueToString(); - - } - catch (Exception) - { - Value = representation = "Unavailable"; - } - } - - private string ValueToString() - { - if (Value == null) - { - return "Null"; - } - try - { - if (IsCollectionOfKnownTypeAndSize(out Type elementType, out int size)) - { - return $"{elementType.Name}[{size}]"; - } - } - catch (Exception) - { - return Value?.ToString(); - } - - - return Value?.ToString(); - } - - private bool IsCollectionOfKnownTypeAndSize(out Type elementType, out int size) - { - elementType = null; - size = 0; - - if (Value == null || Value is string) - { - - return false; - } - - if (Value is IEnumerable ienumerable) - { - var list = ienumerable.Cast().ToList(); - - var types = list.Where(v => v != null).Select(v => v.GetType()).Distinct().ToArray(); - - if (types.Length == 1) - { - elementType = types[0]; - size = list.Count; - - valueAsList = list.Select((e, i) => new CachedMemberResultElement(e, i)).ToList(); - return true; - } - } - - return false; - } - - public override string ToString() - { - return Member.Name + ": " + representation; - } - } private sealed class RegexTreeViewTextFilter : ITreeViewFilter { private readonly ShowObjectView parent; diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs new file mode 100644 index 0000000..a063ef7 --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Reflection; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + + sealed class CachedMemberResult : CachedMemberResultBase + { + protected override string GetMemberName() + { + return Member.Name; + } + + public CachedMemberResult(object parent, MemberInfo mem) + { + Parent = parent; + Member = mem; + + try + { + if (mem is PropertyInfo p) + { + Value = p.GetValue(parent); + } + else if (mem is FieldInfo f) + { + Value = f.GetValue(parent); + } + else + { + throw new NotSupportedException($"Unknown {nameof(MemberInfo)} Type"); + } + + Representation = ValueToString(); + + } + catch (Exception) + { + Value = Representation = "Unavailable"; + } + } + } +} diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs new file mode 100644 index 0000000..9423b72 --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + abstract class CachedMemberResultBase : ICachedMemberResult + { + public T Member; + public object Value {get; protected set;} + public object Parent; + protected string Representation; + private List valueAsList; + + + public bool IsCollection => valueAsList != null; + public IReadOnlyCollection Elements => valueAsList?.AsReadOnly(); + + + protected string ValueToString() + { + if (Value == null) + { + return "Null"; + } + try + { + if (IsCollectionOfKnownTypeAndSize(out Type elementType, out int size)) + { + return $"{elementType.Name}[{size}]"; + } + } + catch (Exception) + { + return Value?.ToString(); + } + + + return Value?.ToString(); + } + + private bool IsCollectionOfKnownTypeAndSize(out Type elementType, out int size) + { + elementType = null; + size = 0; + + if (Value == null || Value is string) + { + + return false; + } + + if (Value is IEnumerable ienumerable) + { + var list = ienumerable.Cast().ToList(); + + var types = list.Where(v => v != null).Select(v => v.GetType()).Distinct().ToArray(); + + if (types.Length == 1) + { + elementType = types[0]; + size = list.Count; + + valueAsList = list.Select((e, i) => new CachedMemberResultElement(e, i)).ToList(); + return true; + } + } + + return false; + } + + public override string ToString() + { + return GetMemberName() + ": " + Representation; + } + + protected abstract string GetMemberName(); + } +} diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs new file mode 100644 index 0000000..b437957 --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + sealed class CachedMemberResultElement + { + public int Index; + public object Value; + + private string representation; + + public CachedMemberResultElement(object value, int index) + { + Index = index; + Value = value; + + try + { + representation = Value?.ToString() ?? "Null"; + } + catch (Exception) + { + Value = representation = "Unavailable"; + } + } + public override string ToString() + { + return $"[{Index}]: {representation}]"; + } + } +} diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs new file mode 100644 index 0000000..1c9cc66 --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using System.Reflection; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + sealed class CachedPSObjectMemberResult : CachedMemberResultBase + { + public CachedPSObjectMemberResult(object parent, PSMemberInfo mem) + { + Parent = parent; + Member = mem; + Value = mem.Value; + Representation = ValueToString(); + } + + protected override string GetMemberName() + { + return Member.Name; + } + } +} diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/ICachedMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/ICachedMemberResult.cs new file mode 100644 index 0000000..e338d92 --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/ICachedMemberResult.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Generic; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + internal interface ICachedMemberResult + { + bool IsCollection { get; } + public object Value {get;} + + public IReadOnlyCollection Elements {get;} + } +} From c61d7d14679d587e96b1fee0c14d48376e9c16f6 Mon Sep 17 00:00:00 2001 From: tznind Date: Sun, 17 Mar 2024 10:11:13 +0000 Subject: [PATCH 5/8] Filter which members are displayed for PSObject as children (i.e. not methods) --- .../ShowObjectView.cs | 13 +--- .../CachedPSObjectMemberResult.cs | 12 +++- .../TreeNodeCaching/PsoHelper.cs | 61 +++++++++++++++++++ 3 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/PsoHelper.cs diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 19e9263..ab22300 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -268,7 +268,7 @@ public IEnumerable GetChildren(object forObject) /// public IEnumerable GetPSObjectChildren(PSObject pso) { - foreach(var m in pso.Members.Where(m=>m.IsInstance)) + foreach(var m in pso.Members.Where(PsoHelper.IsDisplayableMember)) { yield return new CachedPSObjectMemberResult(pso, m); } @@ -295,7 +295,7 @@ internal static void Run(List objects, ApplicationData applicationData try { - window = new ShowObjectView(objects.Select(SelectObject).ToList(), applicationData); + window = new ShowObjectView(objects.Select(PsoHelper.MaybeUnwrap).ToList(), applicationData); Application.Top.Add(window); Application.Run(); } @@ -306,15 +306,6 @@ internal static void Run(List objects, ApplicationData applicationData } } - private static object SelectObject(PSObject obj) - { - if(obj.BaseObject is PSCustomObject) - { - return obj; - } - - return obj.BaseObject; - } private sealed class RegexTreeViewTextFilter : ITreeViewFilter { diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs index 1c9cc66..c3389e3 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs @@ -16,7 +16,17 @@ public CachedPSObjectMemberResult(object parent, PSMemberInfo mem) { Parent = parent; Member = mem; - Value = mem.Value; + + if(mem.Value is PSObject psoVal) + { + Value = PsoHelper.MaybeUnwrap(psoVal); + } + else + { + Value = mem.Value; + } + + Representation = ValueToString(); } diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/PsoHelper.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/PsoHelper.cs new file mode 100644 index 0000000..883122d --- /dev/null +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/PsoHelper.cs @@ -0,0 +1,61 @@ + +using System; +using System.Management.Automation; + +namespace OutGridView.Cmdlet.TreeNodeCaching +{ + class PsoHelper + { + internal static bool IsDisplayableMember(PSMemberInfo m) + { + if(!m.IsInstance) + { + return false; + } + + + if( + m.MemberType == PSMemberTypes.Method || + m.MemberType == PSMemberTypes.CodeMethod || + m.MemberType == PSMemberTypes.Event || + m.MemberType == PSMemberTypes.Methods + ){ + + return false; + } + + return true; + } + + /// + /// Unwraps the if it is likely to + /// be a better (e.g. native) representation of the users input. + /// + /// + /// The native object or the original reference if unwrapping is counter productive. + internal static object MaybeUnwrap(PSObject obj) + { + if(ShouldUnwrap(obj)) + { + return Unwrap(obj); + } + + return obj; + } + + private static bool ShouldUnwrap(PSObject obj) + { + if(obj.BaseObject is PSCustomObject) + { + return false; + } + + return true; + } + + private static object Unwrap(PSObject psoVal) + { + return psoVal.BaseObject; + } + } +} \ No newline at end of file From f639d26c30c590bb3acad24097cc932be08891b1 Mon Sep 17 00:00:00 2001 From: tznind Date: Mon, 18 Mar 2024 06:40:19 +0000 Subject: [PATCH 6/8] Remove generics as they are not needed --- src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs | 2 +- .../TreeNodeCaching/CachedMemberResult.cs | 4 +++- .../TreeNodeCaching/CachedMemberResultBase.cs | 3 +-- .../TreeNodeCaching/CachedPSObjectMemberResult.cs | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index ab22300..5f23874 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -209,7 +209,7 @@ private static bool IsBasicType(object value) public IEnumerable GetChildren(object forObject) { - if(forObject ==null || !this.CanExpand(forObject)) + if(forObject == null || !this.CanExpand(forObject)) { return Enumerable.Empty(); } diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs index a063ef7..d55ab1d 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResult.cs @@ -7,8 +7,10 @@ namespace OutGridView.Cmdlet.TreeNodeCaching { - sealed class CachedMemberResult : CachedMemberResultBase + sealed class CachedMemberResult : CachedMemberResultBase { + MemberInfo Member {get;} + protected override string GetMemberName() { return Member.Name; diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs index 9423b72..8c06e08 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultBase.cs @@ -8,9 +8,8 @@ namespace OutGridView.Cmdlet.TreeNodeCaching { - abstract class CachedMemberResultBase : ICachedMemberResult + abstract class CachedMemberResultBase : ICachedMemberResult { - public T Member; public object Value {get; protected set;} public object Parent; protected string Representation; diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs index c3389e3..db95c12 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedPSObjectMemberResult.cs @@ -10,8 +10,9 @@ namespace OutGridView.Cmdlet.TreeNodeCaching { - sealed class CachedPSObjectMemberResult : CachedMemberResultBase + sealed class CachedPSObjectMemberResult : CachedMemberResultBase { + PSMemberInfo Member {get;} public CachedPSObjectMemberResult(object parent, PSMemberInfo mem) { Parent = parent; From 856bf9c1e0c691484869b2e30955e4660086a26d Mon Sep 17 00:00:00 2001 From: tznind Date: Mon, 18 Mar 2024 06:44:59 +0000 Subject: [PATCH 7/8] Tidy up - Remove unneeded partial - Remove redundant ToString --- src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs index 3e39268..fcf1be5 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/ShowObjectView.cs @@ -17,7 +17,7 @@ namespace OutGridView.Cmdlet { - internal sealed partial class ShowObjectView : Window, ITreeBuilder + internal sealed class ShowObjectView : Window, ITreeBuilder { private readonly TreeView tree; private readonly RegexTreeViewTextFilter filter; @@ -177,11 +177,6 @@ private string AspectGetter(object toRender) { return fsi.Name; } - if(toRender is PSObject o) - { - return o.ToString(); - } - return toRender.ToString(); } From bec7625d9b65cbae0c08bb1cf6699a19c550b9c0 Mon Sep 17 00:00:00 2001 From: tznind Date: Mon, 18 Mar 2024 06:51:25 +0000 Subject: [PATCH 8/8] Fix typo of extra closing bracket on CachedMemberResultElement --- .../TreeNodeCaching/CachedMemberResultElement.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs index b437957..05036ed 100644 --- a/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs +++ b/src/Microsoft.PowerShell.ConsoleGuiTools/TreeNodeCaching/CachedMemberResultElement.cs @@ -28,7 +28,7 @@ public CachedMemberResultElement(object value, int index) } public override string ToString() { - return $"[{Index}]: {representation}]"; + return $"[{Index}]: {representation}"; } } }