我无法相信之前没有问过这个问题,但因为我无法在stackoverflow haystack中找到这个特殊的“针”,我问它。
我想要一个更简洁的GetType()实现.ToString()用于封闭的泛型类型。 neater我的意思是我希望ToString()调用以我在开发环境中输入的格式返回一个字符串。
封闭泛型上的默认GetType()。ToString()将放置` n ,其中 n 是类型的数量,并使用[]代替<>的。
无论如何......代码。
给出以下课程:
A a = new A();
C<A> c = new C<A>();
D<A, B> d = new D<A, B>();
E<B, C<A>, D<A, B>> e = new E<B, C<A>, D<A, B>>();
默认.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.A>
AAA.Events.D<AAA.Events.A,AAA.Events.B>
AAA.Events.E<AAA.Events.B,AAA.Events.C<AAA.Events.A>,AAA.Events.D<AAA.Events.A,AAA.Events.B>>
但我真的希望它回归:
A
C<A>
D<A,B>
E<B,C<A>,D<A,B>>
这是我用来表明我的意图的伪劣代码:
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('[', '<').Replace(']', '>');
}
else return neater;
}
答案 0 :(得分:11)
我会尽量避免尽可能多的字符串解析。我的例程如下:
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;
}
答案 1 :(得分:0)
更多的霰弹枪方法:
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 [
>,您可以增加i
的限制
答案 2 :(得分:0)
我正在尝试执行此操作,并且还需要能够解析这些字符串以将其转换为类型变量。
Here's the code I wrote。它可以将任何类型转换为与C#语法完全相似的字符串,并且可以将这些字符串转换为类型变量。全面支持泛型,包括未绑定的泛型。希望对您有所帮助:)