diff --git a/src/libraries/Common/src/Extensions/TypeNameHelper/TypeNameHelper.cs b/src/libraries/Common/src/Extensions/TypeNameHelper/TypeNameHelper.cs index 2dedd687d87767..90a0b390eb0ce1 100644 --- a/src/libraries/Common/src/Extensions/TypeNameHelper/TypeNameHelper.cs +++ b/src/libraries/Common/src/Extensions/TypeNameHelper/TypeNameHelper.cs @@ -49,43 +49,61 @@ internal static class TypeNameHelper /// The pretty printed type name. public static string GetTypeDisplayName(Type type, bool fullName = true, bool includeGenericParameterNames = false, bool includeGenericParameters = true, char nestedTypeDelimiter = DefaultNestedTypeDelimiter) { - var builder = new StringBuilder(); - ProcessType(builder, type, new DisplayNameOptions(fullName, includeGenericParameterNames, includeGenericParameters, nestedTypeDelimiter)); - return builder.ToString(); + StringBuilder? builder = null; + string? name = ProcessType(ref builder, type, new DisplayNameOptions(fullName, includeGenericParameterNames, includeGenericParameters, nestedTypeDelimiter)); + return name ?? builder?.ToString() ?? string.Empty; } - private static void ProcessType(StringBuilder builder, Type type, in DisplayNameOptions options) + private static string? ProcessType(ref StringBuilder? builder, Type type, in DisplayNameOptions options) { if (type.IsGenericType) { Type[] genericArguments = type.GetGenericArguments(); + builder ??= new StringBuilder(); ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options); } else if (type.IsArray) { + builder ??= new StringBuilder(); ProcessArrayType(builder, type, options); } else if (_builtInTypeNames.TryGetValue(type, out string? builtInName)) { + if (builder is null) return builtInName; + builder.Append(builtInName); } else if (type.IsGenericParameter) { if (options.IncludeGenericParameterNames) { + if (builder is null) return type.Name; + builder.Append(type.Name); } } else { string name = options.FullName ? type.FullName! : type.Name; - builder.Append(name); + if (builder is null) + { + if (options.NestedTypeDelimiter != DefaultNestedTypeDelimiter) + { + return name.Replace(DefaultNestedTypeDelimiter, options.NestedTypeDelimiter); + } + + return name; + } + + builder.Append(name); if (options.NestedTypeDelimiter != DefaultNestedTypeDelimiter) { builder.Replace(DefaultNestedTypeDelimiter, options.NestedTypeDelimiter, builder.Length - name.Length, name.Length); } } + + return null; } private static void ProcessArrayType(StringBuilder builder, Type type, in DisplayNameOptions options) @@ -96,7 +114,7 @@ private static void ProcessArrayType(StringBuilder builder, Type type, in Displa innerType = innerType.GetElementType()!; } - ProcessType(builder, innerType, options); + ProcessType(ref builder!, innerType, options); while (type.IsArray) { @@ -143,7 +161,7 @@ private static void ProcessGenericType(StringBuilder builder, Type type, Type[] builder.Append('<'); for (int i = offset; i < length; i++) { - ProcessType(builder, genericArguments[i], options); + ProcessType(ref builder!, genericArguments[i], options); if (i + 1 == length) { continue;