Siguiendo en este excellent answer, me pregunto si el DLR que usa la palabra clave dynamic
puede permitir una forma menos detallada de escribir código para el ensamblado generado.Use DLR para ejecutar el código generado con CompileAssemblyFromSource?
Por ejemplo, puede código de la respuesta mencionada:
using (Microsoft.CSharp.CSharpCodeProvider foo =
new Microsoft.CSharp.CSharpCodeProvider())
{
var res = foo.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters() {
GenerateInMemory = true
},
"public class FooClass { public string Execute() { return \"output!\";}}"
);
var type = res.CompiledAssembly.GetType("FooClass");
var obj = Activator.CreateInstance(type);
var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}
convertido en algo así como:
using (Microsoft.CSharp.CSharpCodeProvider foo =
new Microsoft.CSharp.CSharpCodeProvider())
{
var res = foo.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters() {
GenerateInMemory = true
},
"public class FooClass { public string Execute() { return \"output!\";}}"
);
var type = res.CompiledAssembly.GetType("FooClass");
dynamic obj = Activator.CreateDynamicInstance(type);
var output = obj.Execute();
}
Sí, hay un código un poco menos. Hazlo funcionar usando en su lugar 'Activator.CreateInstance()'. No veo una pregunta de lo contrario. –
Sí, lo probé y me di cuenta de que "simplemente funciona" con 'dynamic' en lugar de' var'. Bastante genial. –