visual tipo texto tamaño studio para letra fuente font family como codigo code cambiar c# roslyn vs-2015-preview

c# - tipo - ¿Roslyn puede generar código fuente a partir de una instancia de objeto?



font family c# (1)

Usando la API de Roslyn con Visual Studio 2015, ¿puedo convertir una instancia de objeto en código fuente? ¿Puedo crear un método de extensión como ".ToSourceCode ()" como se muestra a continuación?

class Foo { } class Program { static string classSourceCode = "class Foo { }"; static void Main() { var instance = new Foo(); var instanceSourceCode = instance.GetType().ToSourceCode(); System.Diagnostics.Debug.Assert(instanceSourceCode == classSourceCode); } }


No. Sin embargo, ILSpy puede.

Basado en los comentarios sobre la pregunta y lo que entiendo acerca de Roslyn, la descompilación no es compatible. Sin embargo, gracias a la sugerencia ILSpy de @ Bradley, hay una solución:

  1. Descargue los binarios ILSpy de http://ilspy.net/
  2. Haga referencia a los siguientes ensamblados: ICSharpCode.Decompiler.dll, ILSpy.exe, Mono.Cecil.dll, ILSpy.BamlDecompiler.Plugin.dll
  3. Implemente el método de extensión ".ToSourceCode ()" como se muestra a continuación:

using System; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using ICSharpCode.Decompiler; using ICSharpCode.ILSpy; using Mono.Cecil; class Foo { } class Program { static string classSourceCode = "using System; internal class Foo { } "; static void Main() { var instance = new Foo(); var instanceSourceCode = instance.GetType().ToSourceCode(); System.Diagnostics.Debug.Assert(instanceSourceCode == classSourceCode); } } static class TypeExtensions { public static string ToSourceCode(this Type source) { var assembly = AssemblyDefinition.ReadAssembly(Assembly.GetExecutingAssembly().Location); var type = assembly.MainModule.Types.FirstOrDefault(t => t.FullName == source.FullName); if (type == null) return string.Empty; var plainTextOutput = new PlainTextOutput(); var decompiler = new CSharpLanguage(); decompiler.DecompileType(type, plainTextOutput, new DecompilationOptions()); return Regex.Replace(Regex.Replace(plainTextOutput.ToString(), @"/n|/r", " "), @"/s+", " "); } }