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:
- Descargue los binarios ILSpy de http://ilspy.net/
- Haga referencia a los siguientes ensamblados: ICSharpCode.Decompiler.dll, ILSpy.exe, Mono.Cecil.dll, ILSpy.BamlDecompiler.Plugin.dll
- 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+", " ");
}
}