2011-01-26 8 views
10

Decir que tengo algo como esto:¿Cómo ejecutar el código que está en una cadena?

string singleStatement = "System.DateTime.Now"; 

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

Así que:

DateTime currentTime = singleStatement.SomeCoolMethodToRunTheText(); 

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

+1

¿Puedo preguntar por qué lo desea? – dotalchemy

+1

http://scriptcs.net/? :) – NicoJuicy

Respuesta

-1

Puede compilar el código en tiempo de ejecución mediante el uso de un objeto CSharpCodeProvider. Si realmente quieres hacer esto o no, es tema de debate. :-)

1

Leído this (cite a continuación).

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

he encontrado un ejemplo que escribí hace unos meses: asumen usingList es un arraylist con toda instrucción using (sin utilizar palabra clave, System.Xml por ejemplo) asumen importList es un arraylist con todos los nombres de archivo DLL que son necesarios para compilación (system.dll por ejemplo) asumen source es el código fuente que desea recopilar asumen classname es el nombre de la clase que desea compilar asumen methodname es el nombre del método

Tener 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 compilation 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 [email protected]"ES 
FR 
EN 
" 
Regex regex=new Regex(@"^[A-Za-z] 
{ 
    2 
} 
$"); 
result=regex.IsMatch(boxes[0]); 
if (result) 
{ 
    regex=new Regex(@"^"+boxes[0][email protected]".$",RegexOptions.Multiline); 
    result=regex.Matches(pays).Count!=0; 
} 

A continuación, el código que será compilado será el siguiente:

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

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – CodeLikeBeaker

+0

@JasonHeine lo tienes – Shimmy

Cuestiones relacionadas