Get C#-style type reference from CLR-style type full name

落花浮王杯 提交于 2019-12-10 13:13:57

问题


Given a .NET type object found through reflection, is it possible to pretty print or decompile this type as a C# declaration, taking into account C# type aliases, etc.?

For example,

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

I want to be able to print out methods close to what was originally written in the source.

If there isn't anything in the .NET framework, is there a third-party library? I might possibly have a look at ILSpy.


回答1:


See this answer.

Example:

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>"

It will help you with int and string-like things, as well as generics, however you'll have to work out Nullable<T> -> T? and usings yourself.




回答2:


Aliases are compiled to what they are an alias for. You will never know if it was string or String in the source and frankly I can't see why it would matter.




回答3:


There are only 15 aliases (+Nullable). Just use string.Replace on these.




回答4:


There is a solution for type declarations in another post . You can extend it to support type aliases easily.




回答5:


This article has c# source for a method which will do that: http://www.codeproject.com/Tips/621812/User-friendly-names-for-Types



来源:https://stackoverflow.com/questions/6262860/get-c-style-type-reference-from-clr-style-type-full-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!