Ciao, anch'io la penso come Oregon: non ha senso pensare ad un codice che si modifica a runtime. Fai piuttosto un'analisi più attenta e cambia il tipo di approccio al problema. Non posso credere che scrivere "300 if()" sia il modo giusto.
Non è possibile modificare il codice compilato, e comunque, anche tanti anni fa quando programmavamo in assembler, era un'usanza sbagliata, che creava non pochi problemi con cache, multitasking, ecc… e in ogni caso, il codice che si automodifica verrebbe visto come virus, e bloccato dall'antivirus.
Ciononostante, in C#, hai la possibilità di scrivere un codice sorgente (ovviamente dentro un file di testo), e poi invocare il compilatore dal tuo programma, per compilarlo al volo ed eseguirlo, magari, con un metodo tipo Process.Start.
Non so se, nel tuo caso, ti ritorna utile:
using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
namespace Compilazione
{
class Program
{
static void Main(string[] args)
{
string nomeProgetto = "NumeriPrimi"; //nome che si vuole assegnare all'assembly
string percorsoFile = @"D:\Programmi Compilati\Program.cs"; //posizione del file sorgente
string code = File.ReadAllText(percorsoFile);
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
SyntaxTree[] sourceTrees = { tree };
MetadataReference[] references =
{
MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(System.Linq.Enumerable).Assembly.Location),
MetadataReference.CreateFromFile(typeof(System.Numerics.BigInteger).Assembly.Location) //riferimento di esempio
};
CSharpCompilation compilation = CSharpCompilation.Create(nomeProgetto, sourceTrees, references, new CSharpCompilationOptions(OutputKind.ConsoleApplication));
using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(Diagnostic =>
Diagnostic.IsWarningAsError ||
Diagnostic.Severity == DiagnosticSeverity.Error);
foreach (Diagnostic diagnostic in failures)
{
Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
}
}
else
{
using (var file = File.Create($"{Path.GetDirectoryName(percorsoFile)}\\{compilation.AssemblyName}.exe"))
ms.WriteTo(file);
Console.WriteLine("Esito compilazione: success");
}
}
}
}
}