使用C#上的Reflection以良好的格式获取GenericType-Name

And*_*hin 9 .net c# reflection

我需要在代码中以声明的形式获取泛型类型的名称.

例如:对于List <Int32>,我想获取字符串"List <Int32>".在这种情况下,Standart属性Type.Name返回"List`1".

编辑:示例已修复

Car*_*Dev 14

使用内置函数和Linq可以编写

static string PrettyTypeName(Type t)
{
    if (t.IsArray)
    {
        return PrettyTypeName(t.GetElementType()) + "[]";
    }

    if (t.IsGenericType)
    {
        return string.Format(
            "{0}<{1}>",
            t.Name.Substring(0, t.Name.LastIndexOf("`", StringComparison.InvariantCulture)),
            string.Join(", ", t.GetGenericArguments().Select(PrettyTypeName)));
    }

    return t.Name;
}
Run Code Online (Sandbox Code Playgroud)

注意:在较旧版本的C#中,编译器需要显式string.Join:

string.Join(", ", t.GetGenericArguments().Select(PrettyTypeName).ToArray()));
Run Code Online (Sandbox Code Playgroud)


Eri*_*ich 12

好吧,我做了很多研究,发现typeof(List)有"GetGenericArguments",可以获得子名称.所以我会这样做(对于1个泛型类型,如果它是多个,它将​​采取循环或其他东西.如果请求,我可以发布一个函数.

这是一个使用多个泛型参数,处理'嵌套'泛型类型的函数.再次编辑以使用Aggregate函数:

static string GetFullName(Type t)
{
    if (!t.IsGenericType)
        return t.Name;
    StringBuilder sb=new StringBuilder();

    sb.Append(t.Name.Substring(0, t.Name.LastIndexOf("`")));
    sb.Append(t.GetGenericArguments().Aggregate("<",

        delegate(string aggregate,Type type)
            {
                return aggregate + (aggregate == "<" ? "" : ",") + GetFullName(type);
            }  
        ));
    sb.Append(">");

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)