2011-06-07 49 views
6

给定一个通过反射找到的.NET类型对象,是否可以将这种类型打印或反编译为C#声明,同时考虑到C#类型别名等。 ?从CLR风格类型全名获取C#风格的类型引用

例如,

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

我希望能够打印出接近了最初写入源的方法。

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

回答

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Ş自己。

0

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

+0

是啊,这就是为什么我认为在寻找一个C#反编译器的源。实际上,Jon Skeet在另一个问题中提到了CSharpCodeProvider。 – 2011-06-07 09:31:52

1

别名被编译为它们的别名。你永远不会知道它的来源是否是stringString,坦白地说,我不明白为什么它很重要。

+0

我意识到这一点,我试图建议,如果可能的话我会更喜欢别名。 – 2011-06-07 09:27:59