public static string ToString()

in rd-net/Lifetimes/Util/Types.cs [55:103]


    public static string ToString(this Type thisType, bool withNamespaces, bool withGenericArguments = true)
    {
      [return: NotNullIfNotNull("type")]
      string? Present(Type? type, Type[]? genericArguments = null)
      {
        if (type == null)
          return null;

        genericArguments = genericArguments ?? type.GetGenericArguments();

        if (type.IsArray)
          return Present(type.GetElementType()) + "[" + new string(',', type.GetArrayRank() - 1) + "]";

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
          return Present(type.GetGenericArguments().Single()) + "?";

        if (type.IsPrimitive)
          return ourPrimitives.TryGetValue(type, out var primitive) ? primitive : type.Name;

        if (type == typeof(string))
          return "string";

        if (type.IsGenericParameter)
          return type.Name;

        var trait = type.Name;
        var idx = trait.IndexOf('`');
        trait = idx >= 0 ? trait.Substring(0, idx) : trait;


        var allGaCount = genericArguments.Length;
        var outerGaCount = type.DeclaringType?.GetGenericArguments().Length ?? 0;

        if (withGenericArguments && allGaCount > 0)
        {
          var ownArguments = genericArguments.Skip(outerGaCount).Select(t => Present(t));

          trait = trait + "<" + string.Join(", ", ownArguments.ToArray()) + ">";
        }


        var outer = type.DeclaringType;
        return outer == null
          ? (withNamespaces && !string.IsNullOrEmpty(type.Namespace) ? type.Namespace + "." + trait : trait)
          : Present(outer, genericArguments.Take(outerGaCount).ToArray()) + "+" + trait;
      }

      return Present(thisType);
    }