-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Remove extra cast to PSObject in ToStringEnumerable() method #10389
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
dbf43ae
15bdd9e
8c72633
88249e3
db5848f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1122,7 +1122,16 @@ internal static string ToStringEnumerator(ExecutionContext context, IEnumerator | |
| while (enumerator.MoveNext()) | ||
| { | ||
| object obj = enumerator.Current; | ||
| returnValue.Append(PSObject.ToString(context, obj, separator, format, formatProvider, false, false)); | ||
| if (TryFastTrackPrimitiveTypes(obj, format, formatProvider, out string objString)) | ||
| { | ||
| returnValue.Append(objString); | ||
| } | ||
| else | ||
| { | ||
| PSObject mshObj = PSObject.AsPSObject(obj); | ||
| returnValue.Append(PSObject.ToString(context, mshObj, separator, format, formatProvider, false, false)); | ||
| } | ||
|
||
|
|
||
| returnValue.Append(separatorToUse); | ||
| } | ||
|
|
||
|
|
@@ -1131,9 +1140,7 @@ internal static string ToStringEnumerator(ExecutionContext context, IEnumerator | |
| return string.Empty; | ||
| } | ||
|
|
||
| int separatorLength = separatorToUse.Length; | ||
| returnValue.Remove(returnValue.Length - separatorLength, separatorLength); | ||
| return returnValue.ToString(); | ||
| return returnValue.ToString(0, returnValue.Length - separatorToUse.Length); | ||
| } | ||
|
|
||
| internal static string ToStringEnumerable(ExecutionContext context, IEnumerable enumerable, string separator, string format, IFormatProvider formatProvider) | ||
|
|
@@ -1144,8 +1151,15 @@ internal static string ToStringEnumerable(ExecutionContext context, IEnumerable | |
| { | ||
| if (obj != null) | ||
| { | ||
| PSObject mshObj = PSObject.AsPSObject(obj); | ||
| returnValue.Append(PSObject.ToString(context, mshObj, separator, format, formatProvider, false, false)); | ||
| if (TryFastTrackPrimitiveTypes(obj, format, formatProvider, out string objString)) | ||
| { | ||
| returnValue.Append(objString); | ||
| } | ||
| else | ||
| { | ||
| PSObject mshObj = PSObject.AsPSObject(obj); | ||
| returnValue.Append(PSObject.ToString(context, mshObj, separator, format, formatProvider, false, false)); | ||
| } | ||
daxian-dbw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| returnValue.Append(separatorToUse); | ||
|
|
@@ -1156,9 +1170,7 @@ internal static string ToStringEnumerable(ExecutionContext context, IEnumerable | |
| return string.Empty; | ||
| } | ||
|
|
||
| int separatorLength = separatorToUse.Length; | ||
| returnValue.Remove(returnValue.Length - separatorLength, separatorLength); | ||
| return returnValue.ToString(); | ||
| return returnValue.ToString(0, returnValue.Length - separatorToUse.Length); | ||
daxian-dbw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| private static string ToStringEmptyBaseObject(ExecutionContext context, PSObject mshObj, string separator, string format, IFormatProvider formatProvider) | ||
|
|
@@ -1240,6 +1252,42 @@ internal static string ToStringParser(ExecutionContext context, object obj, IFor | |
| } | ||
| } | ||
|
|
||
| private static bool TryFastTrackPrimitiveTypes(object value, string format, IFormatProvider formatProvider, out string str) | ||
| { | ||
| switch (Convert.GetTypeCode(value)) | ||
| { | ||
| case TypeCode.String: | ||
| str = (string)value; | ||
| break; | ||
| case TypeCode.Byte: | ||
| case TypeCode.SByte: | ||
| case TypeCode.Int16: | ||
| case TypeCode.UInt16: | ||
| case TypeCode.Int32: | ||
| case TypeCode.UInt32: | ||
| case TypeCode.Int64: | ||
| case TypeCode.UInt64: | ||
| case TypeCode.DateTime: | ||
| case TypeCode.Decimal: | ||
| var formattable = (IFormattable)value; | ||
| str = formattable.ToString(format, formatProvider); | ||
| break; | ||
| case TypeCode.Double: | ||
| var dbl = (double)value; | ||
| str = dbl.ToString(format ?? LanguagePrimitives.DoublePrecision, formatProvider); | ||
| break; | ||
| case TypeCode.Single: | ||
| var sgl = (float)value; | ||
| str = sgl.ToString(format ?? LanguagePrimitives.SinglePrecision, formatProvider); | ||
| break; | ||
| default: | ||
| str = null; | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Called from an PSObject instance ToString to provide a string representation for an object. | ||
| /// </summary> | ||
|
|
@@ -1269,42 +1317,6 @@ internal static string ToStringParser(ExecutionContext context, object obj, IFor | |
| /// </exception> | ||
| internal static string ToString(ExecutionContext context, object obj, string separator, string format, IFormatProvider formatProvider, bool recurse, bool unravelEnumeratorOnRecurse) | ||
| { | ||
| bool TryFastTrackPrimitiveTypes(object value, out string str) | ||
| { | ||
| switch (Convert.GetTypeCode(value)) | ||
| { | ||
| case TypeCode.String: | ||
| str = (string)value; | ||
| break; | ||
| case TypeCode.Byte: | ||
| case TypeCode.SByte: | ||
| case TypeCode.Int16: | ||
| case TypeCode.UInt16: | ||
| case TypeCode.Int32: | ||
| case TypeCode.UInt32: | ||
| case TypeCode.Int64: | ||
| case TypeCode.UInt64: | ||
| case TypeCode.DateTime: | ||
| case TypeCode.Decimal: | ||
| var formattable = (IFormattable)value; | ||
| str = formattable.ToString(format, formatProvider); | ||
| break; | ||
| case TypeCode.Double: | ||
| var dbl = (double)value; | ||
| str = dbl.ToString(format ?? LanguagePrimitives.DoublePrecision, formatProvider); | ||
| break; | ||
| case TypeCode.Single: | ||
| var sgl = (float)value; | ||
| str = sgl.ToString(format ?? LanguagePrimitives.SinglePrecision, formatProvider); | ||
| break; | ||
| default: | ||
| str = null; | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| PSObject mshObj = obj as PSObject; | ||
|
|
||
| #region plain object | ||
|
|
@@ -1315,7 +1327,7 @@ bool TryFastTrackPrimitiveTypes(object value, out string str) | |
| return string.Empty; | ||
| } | ||
|
|
||
| if (TryFastTrackPrimitiveTypes(obj, out string objString)) | ||
| if (TryFastTrackPrimitiveTypes(obj, format, formatProvider, out string objString)) | ||
| { | ||
| return objString; | ||
| } | ||
|
|
@@ -1493,7 +1505,7 @@ bool TryFastTrackPrimitiveTypes(object value, out string str) | |
| // we try the BaseObject's ToString | ||
| object baseObject = mshObj._immediateBaseObject; | ||
|
|
||
| if (TryFastTrackPrimitiveTypes(baseObject, out string baseObjString)) | ||
| if (TryFastTrackPrimitiveTypes(baseObject, format, formatProvider, out string baseObjString)) | ||
| { | ||
| return baseObjString; | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| # Copyright (c) Microsoft Corporation. All rights reserved. | ||
| # Licensed under the MIT License. | ||
|
|
||
| Describe 'Tests for join operator' -Tags "CI" { | ||
| BeforeAll { | ||
| } | ||
|
|
||
| It 'Join operator can use the custom ToString method defined in ETS' { | ||
| Add-Type -TypeDefinition @" | ||
| namespace TestNS | ||
| { | ||
| public class TestClass | ||
| { | ||
| public override string ToString() | ||
| { | ||
| return "1"; | ||
| } | ||
| } | ||
| } | ||
| "@ | ||
|
|
||
| $a1=[TestNS.TestClass]::new() | ||
| $a2=[TestNS.TestClass]::new() | ||
| $a3=[TestNS.TestClass]::new() | ||
|
|
||
| $a1,$a2,$a3 -join ";" | Should -BeExactly "1;1;1" | ||
|
|
||
| Update-TypeData -TypeName "TestNS.TestClass" -MemberType ScriptMethod -MemberName "ToString" -Value { return "test"} | ||
|
|
||
| $a1,$a2,$a3 -join ";" | Should -BeExactly "test;test;test" | ||
| } | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.