[C# 反射] Type 格式化FullName

由于工作原因,会写一些生成代码的工具,总是需要获取类型的FullName,在生成代码中声明类型。可是Type.FullName的格式总是很恶心。像是泛型总是会存在“`1`2”这类字符,甚至还有冗长的程序集信息,以及嵌套类”+“的符号。

如List<int>,实际FullName是System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea78e]]

我期望的是:System.Collections.Generic.List<System.Int32>

所以写了个Type扩展类,处理FullName

public static class TypeExt
{
    public static string GetFullName(this Type type)
    {
        var str = string.Empty;
        if (type.IsGenericType)
        {
            //获取泛型定义
            //FullName:System.Collections.Generic.List`1
            str = type.GetGenericTypeDefinition().FullName;
            //获取所有泛型类型的数组
            var args = type.GetGenericArguments();
            //泛型类型的数组索引
            int argIndex = 0;
            while (true)
            {
                var startIndex = str.IndexOf('`');
                if (startIndex < 0) break;
                //获取外部类的泛型数量
                var argNum = System.Convert.ToInt32(str.Substring(startIndex + 1, 1));
                string tmp = string.Empty;
                tmp += "<";
                for (int i = 0; i < argNum; i++, argIndex++)
                {
                    if (i < argNum - 1)
                        tmp += $"{args[argIndex].GetFullName()},";
                    else
                        tmp += $"{args[argIndex].GetFullName()}";
                }
                tmp += ">";
                str = str.Remove(startIndex, 2);
                str = str.Insert(startIndex, tmp);
            }
        }
        else
        {
            str = type.FullName ?? string.Empty;
        }

        if (type.IsNested)
        {
            //替换嵌套类的+
            str = str.Replace('+', '.');
        }
        return str;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值