【发布时间】:2013-01-11 18:43:03
【问题描述】:
我不敢相信以前没有人问过这个问题,但是因为我无法在 stackoverflow haystack 中找到这个特殊的“针”,所以我在问它。
我想要一个更简洁的 GetType().ToString() 实现,用于封闭的泛型类型。更简洁的意思是我希望 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;
}
【问题讨论】:
-
我注意到您没有在测试用例中包含嵌套的泛型类型。我也会有点担心你的方法对数组做了什么。
-
我的代码更像是一个业余 VBA hack,而不是真正的代码,我向你保证我无意使用它。我写它是为了表达这个问题,并正在寻找 Linq-i-fied 的解决方案。出于兴趣,如果不是 E,D>,什么是嵌套泛型类型。
-
class A<T> { public class B<U> { } }--(new A<int>.B<double>()).GetType().ToString()的结果是什么?将相同类型传递给NeaterString的结果是什么?
标签: c#