注意:这并不能直接解决您的问题
这是逆转预期的行为吗?
但我觉得它增加了它。
您可以使用GenerateCodeFromExpression
返回一个字符串,该字符串可用于生成为您生成类型的代码,例如使用此代码(由hvd从此SO 答案修改):
/// <summary>
/// <para>Returns a readable name for this type.</para>
/// <para>e.g. for type = typeof(IEnumerable<IComparable<int>>),</para>
/// <para>type.FriendlyName() returns System.Collections.Generic.IEnumerable<System.IComparable<int>></para>
/// <para>type.Name returns IEnumerable`1</para>
/// <para>type.FullName() returns System.Collections.Generic.IEnumerable`1[[System.IComparable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</para>
/// </summary>
public static string FriendlyName(this Type type)
{
string result;
using ( var codeDomProvider = CodeDomProvider.CreateProvider("C#") )
{
var typeReferenceExpression = new CodeTypeReferenceExpression(new CodeTypeReference(type));
using ( var writer = new StringWriter() )
{
codeDomProvider.GenerateCodeFromExpression(typeReferenceExpression, writer, new CodeGeneratorOptions());
result = writer.GetStringBuilder().ToString();
}
}
return result;
}
通过让codeDomProvider
处理字符串表示,您可以确保生成的内容与您定义类型的方式相匹配。
结果FullName
:
// returns "System.String[,,,][,,][,]"
typeof(string[,][, ,][, , ,]).FullName;
// returns "System.String[,][,,][,,,]"
typeof(string[, , ,][, ,][,]).FullName;
// returns "System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
typeof(List<int>).FullName;
结果与FriendlyName
// returns "string[,][,,][,,,]"
typeof(string[,][, ,][, , ,]).FriendlyName();
// returns "string[,,,][,,][,]"
typeof(string[, , ,][, ,][,]).FriendlyName();
// returns "System.Collections.Generic.List<int>"
typeof(List<int>).FriendlyName();