从CLR样式类型的全名获取C#样式类型引用

时间:2011-06-07 08:55:49

标签: c# reflection types decompiling pretty-print

考虑到通过反射找到的.NET类型对象,是否可以将此类型打印或反编译为C#声明,同时考虑C#类型别名等?

例如,

Int32 -> int
String -> string   
Nullable<Int32> -> int?
List<au.net.ExampleObject> -> List<ExampleObject>

我希望能够打印出与源中最初编写的方法相近的方法。

如果.NET框架中没有任何内容,是否有第三方库?我可能会看一下ILSpy

5 个答案:

答案 0 :(得分:7)

请参阅this回答。

示例:

using System.CodeDom;
using System.CodeDom.Compiler;

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

var typeRef = new CodeTypeReference("System.Nullable`1[System.Int32]");
string typeOutput = provider.GetTypeOutput(typeRef); // "System.Nullable<int>"

它会帮助您处理intstring - 类似的事情以及泛型,但是您必须自己制定Nullable<T> -> T?using

答案 1 :(得分:1)

将别名编译为它们的别名。你永远不会知道来源中是string还是String,坦白说我不明白为什么会这么重要。

答案 2 :(得分:1)

There are only 15 aliases (+Nullable)。只需在这些上使用string.Replace。

答案 3 :(得分:0)

another post中有类型声明的解决方案。 您可以将其扩展为轻松支持类型别名。

答案 4 :(得分:0)

本文的c#source源代码可以执行此操作:http://www.codeproject.com/Tips/621812/User-friendly-names-for-Types