当前位置:  开发笔记 > 编程语言 > 正文

如何使用反射获得泛型类型的正确文本定义?

如何解决《如何使用反射获得泛型类型的正确文本定义?》经验,为你挑选了2个好方法。



1> JaredPar..:

没有内置的方法可以在.Net Framework中获得此表示.也就是因为没有办法让它变得正确.在C#样式语法中有许多不能表示的构造.例如,"<> foo"是IL中的有效类型名称,但不能用C#表示.

但是,如果您正在寻找一个非常好的解决方案,它可以很快地手工实施.以下解决方案适用于大多数情况.它不会处理

    嵌套类型

    非法的C#名称

    几个其他场景

例:

public static string GetFriendlyTypeName(Type type) {
    if (type.IsGenericParameter)
    {
        return type.Name;
    }

    if (!type.IsGenericType)
    {
        return type.FullName;
    }

    var builder = new System.Text.StringBuilder();
    var name = type.Name;
    var index = name.IndexOf("`");
    builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index));
    builder.Append('<');
    var first = true;
    foreach (var arg in type.GetGenericArguments())
    {
        if (!first)
        {
            builder.Append(',');
        }
        builder.Append(GetFriendlyTypeName(arg));
        first = false;
    }
    builder.Append('>');
    return builder.ToString();
}



2> bluish..:

由于@ LukeH的评论,一个好的和干净的选择是

using System;
using System.CodeDom;
using System.Collections.Generic;
using Microsoft.CSharp;
//...
private string GetFriendlyTypeName(Type type)
{
    using (var p = new CSharpCodeProvider())
    {
        var r = new CodeTypeReference(type);
        return p.GetTypeOutput(r);
    }
}


更好然后标记为答案(通用类的子类正确显示)
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有