È certamente possibile. La classe CodeSnippetCompileUnit fa fondamentalmente questo. Ti ho scritto un esempio di codice d'uso. Dovrai includere questi spazi dei nomi:
- System.CodeDom.Compiler;
- System.CodeDom;
- Microsoft.CSharp;
- System.Reflection;
Ecco il codice:
string source = @"
class MyType
{
public static int Evaluate(<!parameters!>)
{
return <!expression!>;
}
}
";
string parameters = "int a, int b, int c";
string expression = "a + b * c";
string finalSource = source.Replace("<!parameters!>", parameters).Replace("<!expression!>", expression);
CodeSnippetCompileUnit compileUnit = new CodeSnippetCompileUnit(finalSource);
CodeDomProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
CompilerResults results = provider.CompileAssemblyFromDom(parameters, compileUnit);
Type type = results.CompiledAssembly.GetType("MyType");
MethodInfo method = type.GetMethod("Evaluate");
// The first parameter is the instance to invoke the method on. Because our Evaluate method is static, we pass null.
int result = (int)method.Invoke(null, new object[] { 4, -3, 2 });
replace 'parametri' e 'l'espressione' di qualsiasi altra cosa, e ti sei preso un valutatore generale espressione.
Se si ottiene un oggetto FileNotFoundException in results.CompiledAssembly, lo snippet non è stato compilato.
Si potrebbe anche voler dare un'occhiata alla classe System.CodeDom.CodeSnippetExpression. Viene utilizzato per leggere le espressioni in modo più specifico, ma un'espressione di per sé non può essere compilata, quindi è necessario utilizzare più CodeDom per creare una classe di lavoro e un metodo attorno ad esso. Questo è utile se vuoi essere in grado di manipolare a livello di codice il tipo di classe che stai generando. CodeSnippetCompileUnit è bello generare un'intera classe di lavoro in una volta (e più semplice per un esempio) ma per manipolarlo si dovrebbero fare manipolazioni di stringa inopportune.
Ho fatto una domanda simile un po 'indietro. Si consiglia di guardare alcune di queste risposte: http://stackoverflow.com/questions/234217/is-it-possible-to-translate-a-user-entered-mathematical-equation-into-c-code-at – raven
Hai trovato un modo per collegare le variabili utilizzate nel resto del codice "statico/precompilato"? –