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);
}