/// <summary> /// </summary> /// <param name="t"></param> /// <param name="settings">Используем одни настройки для всех типов.</param> /// <returns></returns> public static string GetNormalTypeName(this Type t, TypeNamingSettings settings) { return(GetNormalTypeName( t, (type, s) => { s.WithNamespace = settings.WithNamespace; })); }
/// <summary> /// /// </summary> /// <param name="typeSettingsResolver">Вызывается каждый раз для получения имени какого-нибудь типа, /// включая внутренние generic типы.</param> /// <returns></returns> public static string GetNormalTypeName(this Type t, Action <Type, TypeNamingSettings> typeSettingsResolver) { var settings = new TypeNamingSettings(); typeSettingsResolver?.Invoke(t, settings); bool withNamespace = settings.WithNamespace; var key = t.FullName + "_" + withNamespace.ToString(); if (_normalTypeNamesCahce.ContainsKey(key)) { return(_normalTypeNamesCahce[key]); } var name = withNamespace ? t.Namespace + "." : ""; if (t.IsGenericType) { //Remove generic declaration part name += t.Name.Remove(t.Name.IndexOf("`", StringComparison.Ordinal)) + "<"; var genericArgs = t.GetGenericArguments(); var firstArg = genericArgs[0]; name += GetNormalTypeName(firstArg, typeSettingsResolver); for (var i = 1; i < genericArgs.Length; i++) { name += ", " + GetNormalTypeName(genericArgs[i], typeSettingsResolver); } name += ">"; return(name); } var res = name + t.Name; _normalTypeNamesCahce[key] = res; return(res); }