J'ai un ensemble similaire de classes que j'utilise pour cela, en intégrant la génération de texte modélisé dans le logiciel.
Fondamentalement, cela fonctionne comme ASP ancien, vous entourez le code C# dans <%...%>
blocs, et vous pouvez émettre des résultats en utilisant <%= expression %>
.
Vous pouvez transmettre un seul objet dans le code du modèle, ce qui peut bien sûr être n'importe quel type d'objet que vous aimez, ou simplement un tableau de paramètres. Vous pouvez également référencer vos propres assemblys si vous souhaitez exécuter du code personnalisé.
Voici comment émettre une classe regarderait:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Vous pouvez la boucle de cours à travers les choses:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
et mettre le code si-blocs, etc.
La bibliothèque de classe est publié sur CodePlex ici:
ainsi que sur NuGet.
Le projet est livré avec des exemples, télécharger la source ou browse it online.
Pour répondre aux questions par e-mail ici aussi, pour d'autres à voir:
- Tous les types de code C# qui entrent dans un appel de méthode peut être compilé dans le modèle. Il fonctionne avec du code C# 3.5 normal, avec tout ce que cela signifie, il n'y a pas de limites artificielles. Seules les choses à savoir est que tout code if, while, for, foreach, etc. qui contient du code de modèle à émettre doit utiliser des accolades, vous ne pouvez pas faire un bloc de type if-then sur une seule ligne. Voir ci-dessous pour la limitation de l'appel de méthode.
- Le paramètre
data
correspond à tout ce qui a été transmis en tant que paramètre à la méthode .Generate(x)
à partir de votre application et est du même type. Si vous transmettez un objet que vous avez défini dans vos propres bibliothèques de classes, vous devez ajouter une référence au code du modèle afin de pouvoir y accéder correctement.(<%@ reference your.class.library.dll %>
)
- Si vous réutilisez le modèle compilé, il s'agira essentiellement d'un appel de méthode à une classe, aucun surcoût supplémentaire n'est effectué sur l'appel réel à
.Generate()
. Si vous n'appelez pas .Compile()
vous-même, le premier appel à .Generate()
s'en occupera. Notez également que le code s'exécute dans un domaine d'application distinct, il y a donc une légère surcharge liée à la copie du paramètre et au résultat d'avant en arrière. Le code, cependant, s'exécute à la vitesse du code JITted .NET normal.
Exemple de si-bloc:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
Il n'y a pas des limites artificielles sur le formatage du code soit, choisissez le style qui vous convient le mieux:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
noter seulement que tous les non les parties de code du modèle seront à peu près sorties telles quelles, ce qui signifie que les onglets et les blocs %>
suivants seront également générés.
Il y a une limite, tout le code que vous écrivez doit tenir dans un seul appel de méthode.
Laissez-moi vous expliquer.
La façon dont fonctionne le moteur de modèle est qu'il produit un fichier .cs et nourrit au compilateur C#, ce .cs fichier ressemble roughyly comme ceci:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Cela signifie que vous ne pouvez pas définir de nouvelles classes , de nouvelles méthodes, des champs de niveau classe, etc.
Vous pouvez toutefois utiliser des délégués anonymes pour créer des fonctions en interne. Par exemple, si vous voulez un moyen uniforme de dates de mise en forme:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
alors vous pouvez simplement utiliser que dans le reste du code du modèle:
<%= date2str(DateTime.Now) %>
Seulement condition que j'ai est que vous n » t télécharger les fichiers sur le web et prétendre que vous avez écrit le code, sauf que vous êtes libre de faire ce que vous voulez avec.
Édition 23.04.2011: Liens fixes au projet CodePlex.
Wooow O.o Je télécharge ceci maintenant et je vous ferai savoir comment ça se passe. S'il fait tout ce que vous dites, vous serez un sauveur de vie absolue! – Amberite
Edité la réponse maintenant, comme vous l'avez dit dans l'email, la variable "Data" n'existe pas, car elle s'appelle "data". C'est un paramètre de méthode, d'où le "d" minuscule. –
"Le fonctionnement du moteur de gabarit est qu'il produit un fichier .cs et le transmet au compilateur C#": cela ne signifie-t-il pas que la machine qui exécute cela a besoin de VisStudio ou au moins quelque chose d'autre? Ou y a-t-il un moyen que vous appeliez par programmation le compilateur C#? Je ne pensais pas que le compilateur était livré avec le .net runtime ... Bien qu'IIS puisse compiler ASP.NET à la volée, je suppose qu'il doit être là quelque part ... – CodingWithSpike