4

これが以前に尋ねられなかったとは信じられませんが、stackoverflowの干し草の山でこの特定の「針」を見つけることができないので、尋ねています。

閉じたジェネリック型の 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; 
}
4

3 に答える 3

12

できるだけ多くの文字列解析を避けようとします。私のルーチンは次のようになります。

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;
}
于 2013-01-11T18:48:26.690 に答える