2011-01-26 15 views
10

Dire che ho qualcosa di simile:Come eseguire il codice che si trova in una stringa?

string singleStatement = "System.DateTime.Now"; 

C'è qualche modo per prendere singleStatement e analizzare ed eseguirlo in fase di esecuzione?

In modo che:

DateTime currentTime = singleStatement.SomeCoolMethodToRunTheText(); 

sarebbe assegnare il valore di DateTime.Now a currentTime.

+1

Posso chiedere perché vorresti? – dotalchemy

+1

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

risposta

-1

È possibile compilare il codice in fase di esecuzione utilizzando utilizzando un oggetto CSharpCodeProvider. Se vuoi davvero farlo o meno è pronto per il dibattito. :-)

1

Leggi this (la citazione segue).

Ciò è possibile: dare un'occhiata a System.CodeDom e System.CodeDom.Compiler.

ho trovato un esempio che ho scritto qualche mese fa: assumere usingList è un arraylist con tutte le istruzione using (senza usare parola chiave, System.Xml per esempio) assumere importList è un arraylist con tutta nome dll che sono necessari per compilazione (system.dll per esempio) assumere source è il codice sorgente da compilare assumere classname è il nome della classe che si desidera compilare assumere methodname è il nome del metodo

Date un'occhiata al seguente codice:

//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); 
} 

Per esempio,

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; 
} 

Quindi il codice che verrà compilato sarà il seguente:

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

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – CodeLikeBeaker

+0

@JasonHeine hai capito – Shimmy

Problemi correlati