2011-06-07 63 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