Ich habe eine ähnliche Reihe von Klassen, die ich dafür verwende, Template-Texterzeugung in Software eingebettet.
Grundsätzlich funktioniert es wie altmodischer ASP, Sie umgeben C# -Code in <%...%>
Blöcke, und Sie können Ergebnisse ausgeben, indem Sie <%= expression %>
verwenden.
Sie können ein einzelnes Objekt in den Template-Code übergeben, die natürlich jeder Objekttyp sein, die Sie mögen, oder einfach eine Reihe von Parametern. Sie können auch auf Ihre eigenen Assemblies verweisen, wenn Sie benutzerdefinierten Code ausführen möchten.
Hier ist, wie eine Klasse emittierende aussehen:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Sie können natürlich eine Schleife durch Dinge:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
und setzen Code in if-Blöcke usw.
Die Klassenbibliothek ist auf CodePlex hier freigegeben:
sowie NuGet.
Das Projekt kommt mit Beispielen, laden Sie die Quelle oder browse it online.
Um auch hier Fragen per E-Mail zu beantworten, für andere zu sehen:
- Alle Arten von C# -Code die in einen Methodenaufruf paßt in der Vorlage erstellt werden. Es läuft normaler C# 3.5-Code, mit allem, was bedeutet, dass es keine künstlichen Grenzen gibt. Nur Dinge zu wissen ist, dass alle, wenn, während, für, foreach, etc. Code, der Vorlage Code enthält, um Klammern zu verwenden, können Sie nicht eine einzeilige Wenn-dann-Typ-Block. Siehe unten für die Methodenaufrufbegrenzung.
- Der Parameter
data
entspricht dem, was in Ihrer Anwendung als Parameter für die Methode .Generate(x)
übergeben wurde, und ist vom gleichen Typ. Wenn Sie ein Objekt übergeben, das Sie in Ihren eigenen Klassenbibliotheken definiert haben, müssen Sie einen Verweis auf den Vorlagencode hinzufügen, um ordnungsgemäß darauf zugreifen zu können.(<%@ reference your.class.library.dll %>
)
- Wenn Sie die kompilierte Vorlage wiederverwenden, wird es nur im Wesentlichen zu einer Klasse ein Methodenaufruf, kein zusätzlicher Aufwand auf dem tatsächlichen Aufruf
.Generate()
getan. Wenn Sie .Compile()
nicht selbst anrufen, wird der erste Anruf an .Generate()
dafür sorgen. Beachten Sie außerdem, dass der Code in einer separaten Anwendungsdomäne ausgeführt wird, sodass ein geringer Aufwand für das Marshalling im Zusammenhang mit dem Kopieren des Parameters und des Ergebnisses besteht. Der Code wird jedoch mit normaler JITted .NET-Code-Geschwindigkeit ausgeführt.
Beispiel if-Block:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
gibt es keine künstlichen Grenzen den Code entweder auf die Formatierung, den Stil auswählen, die Ihnen am besten passt:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
beachten Sie nur, dass alle Nicht- Code-Teile der Vorlage werden so ziemlich ausgegeben wie sie sind, was bedeutet, dass Tabs und solche folgenden %>
Blöcke ebenfalls ausgegeben werden.
Es gibt eine Grenze, den ganzen Code, den Sie in einem einzigen Methodenaufruf passen schreiben müssen.
Lassen Sie mich erklären.
Die Art und Weise der Template-Engine funktioniert, ist, dass es eine CS-Datei erzeugt und führt es dem C# -Compiler, diese CS-Datei sieht roughyly wie folgt aus:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Das bedeutet, dass Sie keine neuen Klassen definieren , neue Methoden, Klasse-Ebene Felder etc.
Sie können jedoch verwenden anonyme Delegaten Funktionen intern zu erstellen. Zum Beispiel, wenn Sie wollen, eine einheitliche Art und Weise Formatierungsdaten:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
dann können Sie einfach die Verwendung in den Rest der Template-Code:
<%= date2str(DateTime.Now) %>
Einzige Voraussetzung ist, dass ich Sie don‘ t lade die Dateien ins Web hoch und behaupte, du hättest den Code geschrieben, außer dass du damit frei machen kannst, was du willst.
Bearbeiten 23.04.2011: Feste Verknüpfungen zum CodePlex-Projekt.
Wooow O.o Ich lade dies gerade jetzt und ich werde Sie wissen lassen, wie es geht. Wenn es alles tut, was du sagst, ist es ein absoluter Lebensretter! – Amberite
Bearbeitete die Antwort jetzt, wie Sie in der E-Mail sagten, die Variable "Data" existiert nicht, weil sie "Daten" genannt wird. Es ist ein Methodenparameter, daher der Kleinbuchstabe "d". –
"Die Funktionsweise der Template-Engine besteht darin, dass sie eine CS-Datei erzeugt und sie dem C# -Compiler zuführt": Bedeutet das nicht auch, dass auf dem Rechner VisStudio oder zumindest etwas anderes installiert sein muss? Oder gibt es eine Möglichkeit, den C# -Compiler programmatisch aufzurufen? Ich dachte nicht, dass der Compiler mit der .NET-Laufzeitumgebung ausgeliefert wurde ... Obwohl IIS ASP.NET im laufenden Betrieb kompilieren kann, muss es irgendwo da draußen sein ... – CodingWithSpike