C# 用于封闭泛型的更简洁的GetType().ToString()

C# 用于封闭泛型的更简洁的GetType().ToString(),c#,C#,我不敢相信以前没有人问过这个问题,但由于我无法在stackoverflow的草堆中找到这个特殊的“针”,我正在问它 我希望为封闭泛型类型提供一个更简洁的GetType().ToString()实现。我的意思是,我希望ToString()调用以我在开发环境中键入的格式返回字符串 封闭泛型上的默认GetType().ToString()将放置'n,其中n是类型数,并使用[]而不是's 无论如何。。。遵守守则 鉴于以下类别: A a = new A(); C<A> c = new C<

我不敢相信以前没有人问过这个问题,但由于我无法在stackoverflow的草堆中找到这个特殊的“针”,我正在问它

我希望为封闭泛型类型提供一个更简洁的GetType().ToString()实现。我的意思是,我希望ToString()调用以我在开发环境中键入的格式返回字符串

封闭泛型上的默认GetType().ToString()将放置'n,其中n是类型数,并使用[]而不是's

无论如何。。。遵守守则

鉴于以下类别:

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>>();
我已经编写了一些基本的老式(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>>
AAA.Events.A
AAA.Events.C
AAA.Events.D
AAA.Events.E
但我真的希望它能回来:

A
C<A>
D<A,B>
E<B,C<A>,D<A,B>>
A
C
D
E
以下是我为证明我的意图而编写的劣质代码:

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; 
}
公共静态字符串NeaterString(此类型为t)
{
字符串整洁=t.ToString();
if(neater.Contains('`'))
{
while(neater.Contains('`'))
{
neater=neater.Remove(neater.IndexOf('`'),2);
}
返回整洁。替换(“[”,“);
}
否则返回整洁;
}

我会尽量避免字符串解析。我的例程如下所示:

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;
}
公共静态字符串GetFriendlyName(类型)
{
if(type.IsGenericType)
返回string.Format(“{0}”,type.Name.Split(“`')[0],string.Join(“,”,type.GetGenericArguments().Select(x=>GetFriendlyName(x));
其他的
返回类型.名称;
}

更多的是散弹枪方法:

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;
    }
}
公共静态类类型扩展
{
公共静态字符串预打印(此类型)
{
var str=type.ToString();
对于(int i=1;i<6;i++)
{
str=str.Replace($“`i}[”,”);
var knownNamespaces=new[]
{
“系统。”,
“我的.模特儿。”,
“域名。”
};
foreach(knownNamespaces中的var knownNamespace)
{
str=str.Replace(knownNamespace,string.Empty);
}
返回str;
}
}

如果有超复杂的泛型将超过'5[

的话,可以增加对
i
的限制,我正试图这样做,我还需要能够解析这些字符串,将它们转换回类型变量


。它可以将任何类型转换为与C#语法完全相同的字符串,并且可以将这些字符串转换回类型变量。完全支持泛型,包括未绑定泛型。希望有帮助:)

有人问过。我注意到您的测试用例中没有包含嵌套泛型类型。我还有些担心您的方法与数组有关。我的代码更像业余VBA黑客,而不是真正的代码,我向你保证我无意使用它。我写它是为了表达这个问题,并寻找Linq-I-fied解决方案。出于兴趣,如果不是E,嵌套泛型类型是什么。
CLASSE a{public CLASSE B{}
--
的结果是什么(新的A.B()).GetType().ToString()
?将相同类型传递给
NeaterString
的结果是什么?可以通过将方法组直接传递给
Select
。即:
。Select(GetFriendlyName)
,避免分配lambda。
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;
    }
}