一个更整洁的GetType()。ToString()用于封闭的generics

我不敢相信以前没有问过这个,但是因为我无法在stackoverflow haystack中找到这个特殊的“针”,我问它。

我想要一个更简洁的GetType()实现.ToString()用于封闭的generics类型。 neater我的意思是我希望ToString()调用以我将输入到开发环境中的格式返回一个字符串。

封闭generics上的默认GetType()。ToString()将放置` n ,其中n是类型数,并使用[]代替。

无论如何……代码。

给出以下课程:

A a = new A(); C c = new C(); D d = new D(); E<B, C, D> e = new E<B, C, D>(); 

默认的.ToString()返回:

 AAA.Events.A AAA.Events.C`1[AAA.Events.A] AAA.Events.D`2[AAA.Events.A,AAA.Events.B] AAA.Events.E`3[AAA.Events.B,AAA.Events.C`1[AAA.Events.A],AAA.Events.D`2 

我写了一些基本的旧学校(pre linq)代码来制作:

 AAA.Events.A AAA.Events.C AAA.Events.D AAA.Events.E<AAA.Events.B,AAA.Events.C,AAA.Events.D> 

但我真的希望它回归:

 A C D E<B,C,D> 

这是我为了certificate我的意图所写的伪劣代码:

 public static string NeaterString(this Type t) { string neater = t.ToString(); if (neater.Contains('`')) { while (neater.Contains('`')) { neater = neater.Remove(neater.IndexOf('`'), 2); } return neater.Replace('[', ''); } else return neater; } 

我会尽量避免尽可能多的字符串解析。 我的例程看起来像这样:

 public static string GetFriendlyName(Type type) { if (type.IsGenericType) return string.Format("{0}<{1}>", type.Name.Split('`')[0], string.Join(", ", type.GetGenericArguments().Select(x => GetFriendlyName(x)))); else return type.Name; } 

更多的霰弹枪方法:

 public static class TypeExtensions { public static string PrettyPrint(this Type type) { var str = type.ToString(); for (int i = 1; i < 6; i++) { str = str.Replace($"`{i}[", "<"); } str = str.Replace("]", ">"); var knownNamespaces = new[] { "System.", "My.Models.", "Domain." }; foreach (var knownNamespace in knownNamespaces) { str = str.Replace(knownNamespace, string.Empty); } return str; } } 

如果你有超过5的超复杂generics,你可以增加对i的限制