É legal a ideia, mas seu código parece bastante perigoso e lento. Você invoca código durante o runtime. Para isso, tem que compilar e executar o código, que já é um tempo gigantesco. É a mesma ideia do RazorLight.
O perigo está na execução de código malicioso em um ambiente que você não tem total controle dos arquivos "template" que serão usados.
Para contornar o tempo de espera toda vez que for compilar um script do template, você pode fazer o template expor um método que irá compilar o template e compilar uma vez só, depois de chamar o CSharpScript.EvaluateAsync
, o método já estará disponível no seu AppDomain, então poderá invocá-lo através de reflexão, sem exigir outra compilação.
Você precisará gerar uma namespace para cada script gerado também, é claro.
Uma alternativa ainda mais segura é usar source generators, que é uma ferramenta avançada, mas super performática.
Eu venho há algum tempo cuidando de um gerador de HTML que criei usando C#. O foco dele é ser super simples, minimalista, fácil de usar. Algo como:
string[] Products = ["Camisa", "Calça", "Tênis"];
string Cliente = "João da Silva";
HtmlElement body = HtmlElement.Fragment(
HtmlElement.Auto("style", """
* {
background-color: red;
}
"""),
HtmlElement.Auto("h1", "Pedido confirmado!"),
HtmlElement.Auto("p", "Cliente: ",
HtmlElement.Auto("strong", Cliente)),
HtmlElement.Auto("p", "Você comprou os produtos:"),
HtmlElement.Auto("ul",
Products.Select(p => HtmlElement.Auto("li", p))),
HtmlElement.Auto("p", "Obrigado por comprar conosco!"));
Gera este resultado:
<style>
* {
background-color: red;
}
</style>
<h1>Pedido confirmado!</h1>
<p>Cliente: <strong>João da Silva</strong></p>
<p>Você comprou os produtos:</p>
<ul>
<li>Camisa</li>
<li>Calça</li>
<li>Tênis</li>
</ul>
<p>Obrigado por comprar conosco!</p>
Em só alguns ciclos de processamento.