没有内置的方法可以在.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(); }
由于@ 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); } }