¿Cómo ejecutar código que está en una cadena?

Digamos que tengo algo como esto:

string singleStatement = "System.DateTime.Now"; 

¿Hay alguna forma de tomar singleStatement y analizar y ejecutar en tiempo de ejecución?

Así que eso:

 DateTime currentTime = singleStatement.SomeCoolMethodToRunTheText(); 

asignaría el valor de DateTime.Now a currentTime .

Lea esto (la cita sigue).

Eso es posible: eche un vistazo a System.CodeDom y System.CodeDom.Compiler .

He encontrado un ejemplo que escribí hace unos meses: supongamos que usingList es un arraylist con todas las instrucciones de uso (sin usar la palabra clave, System.Xml , por ejemplo), suponiendo que importList es un arraylist con todo el nombre de dll necesario para la comstackción ( system.dll para ejemplo) asumir que la source es el código fuente que desea comstackr asumir el nombre de la clase es el nombre de la clase que desea comstackr asumir el nombre del método es el nombre del método

Echa un vistazo al siguiente código:

 //Create method CodeMemberMethod pMethod = new CodeMemberMethod(); pMethod.Name = methodname; pMethod.Attributes = MemberAttributes.Public; pMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string[]),"boxes")); pMethod.ReturnType=new CodeTypeReference(typeof(bool)); pMethod.Statements.Add(new CodeSnippetExpression(@" bool result = true; try { " + source + @" } catch { result = false; } return result; ")); //Crée la classe CodeTypeDeclaration pClass = new System.CodeDom.CodeTypeDeclaration(classname); pClass.Attributes = MemberAttributes.Public; pClass.Members.Add(pMethod); //Crée le namespace CodeNamespace pNamespace = new CodeNamespace("myNameSpace"); pNamespace.Types.Add(pClass); foreach(string sUsing in usingList) pNamespace.Imports.Add(new CodeNamespaceImport(sUsing)); //Create compile unit CodeCompileUnit pUnit = new CodeCompileUnit(); pUnit.Namespaces.Add(pNamespace); //Make comstacktion parameters CompilerParameters pParams = new CompilerParameters((string[])importList.ToArray(typeof(string))); pParams.GenerateInMemory = true; //Compile CompilerResults pResults = (new CSharpCodeProvider()) .CreateCompiler().CompileAssemblyFromDom(pParams, pUnit); if (pResults.Errors != null && pResults.Errors.Count>0) { foreach(CompilerError pError in pResults.Errors) MessageBox.Show(pError.ToString()); result = pResults.CompiledAssembly.CreateInstance("myNameSp ace."+classname); } 

Por ejemplo,

 if 'usingList' equals { "System.Text.RegularExpressions" } if 'importList' equals { "System.dll" } if 'classname' equals "myClass" if 'methodName' equals "myMethod" if 'source' equals " string pays=@"ES FR EN " Regex regex=new Regex(@"^[A-Za-z] { 2 } $"); result=regex.IsMatch(boxes[0]); if (result) { regex=new Regex(@"^"+boxes[0]+@".$",RegexOptions.Multiline); result=regex.Matches(pays).Count!=0; } 

Entonces el código que se comstackrá será el siguiente:

 using System.Text.RegularExpressions; namespace myNameSpace { public class myClass { public bool myMethod(string[] boxes) { bool result=true; try { string pays=@"ES FR EN " Regex regex=new Regex(@"^[A-Za-z] { 2 } $"); result=regex.IsMatch(boxes[0]); if (result) { regex=new Regex(@"^"+boxes[0]+@".$",RegexOptions.Multiline); result=regex.Matches(pays).Count!=0; } } catch { result=false; } return result; } } } 

Esto solo es posible mediante el uso de servicios de comstackción y Reflection.Emit() que se comstackrán y ensamblarán y cargarán en la memoria.

Echa un vistazo aquí.

http://www.c-sharpcorner.com/UploadFile/puranindia/419/

Puede comstackr el código en tiempo de ejecución utilizando un objeto CSharpCodeProvider. Si realmente quieres hacer esto o no, es tema de debate. 🙂