2011-02-07 10 views
7

Teniendo en cuenta el ejemplo siguiente declaración lambda:.NET - volcado cuerpo de la declaración lambda para la cadena

var fMyAction = new Action(() => 
{ 
    x += 2; 
    something = what + ever; 
}); 

Cuáles son las posibles maneras de conseguir el cuerpo de ese lambda y lo descarga a la cadena? (Algo que finalmente permitirá escribir un método de extensión para la clase Action de este tipo: fMyAction.Dump() que devolverá "x += 2; something = what + ever;").

Gracias

+0

¿Para qué sirve? Proporcione más antecedentes sobre su pregunta, probablemente haya una solución completamente diferente. Lo que estás tratando de hacer ahora es casi imposible y no tiene sentido en C-sharp. –

+1

@ SK-logic: Eso estaría definitivamente fuera del alcance de esta publicación específica para discutir mis propios motivos en el nivel abstracto. –

+0

no obtendrá una respuesta útil sin explicar al menos por qué necesita una representación de cadena, qué tan cerca debe estar esta cadena de una fuente original y cuáles son sus requisitos de rendimiento. Hay varias opciones disponibles además de la descompilación. –

Respuesta

11

No es posible en esa forma. Tu lamda se compila en código de bytes. Si bien en teoría es posible descompilar el código de bytes, al igual que el reflector, es difícil, propenso a errores y no proporciona el código exacto que compiló, sino solo el código que es equivalente.

Si use an Expression<Action> en lugar de solo Action obtiene el árbol de expresiones que describe la lamda. Y la conversión de un árbol de expresiones a una cadena es posible (y existen bibliotecas existentes que lo hacen).

Pero eso no es posible en su ejemplo, ya que es un multi hoja de instrucciones. Y solo las lamdas simples se pueden convertir automáticamente a un árbol de expresiones.

+0

Tienes razón ... Encontré esto y estaba listo para abrir champagne: http://code.msdn.microsoft.com/exprserialization Luego, de repente: http://msdn.microsoft.com/en-us/ library/bb397745.aspx –

Cuestiones relacionadas