Tengo un conjunto similar de clases que utilizo para esto, incorporando la generación de texto con plantilla en el software.
Básicamente, funciona como ASP antiguo, rodea el código C# en los bloques <%...%>
, y puede emitir resultados usando <%= expression %>
.
Puede pasar un solo objeto al código de plantilla, que por supuesto puede ser del tipo de objeto que desee, o simplemente una matriz de parámetros. También puede hacer referencia a sus propios ensamblajes si desea ejecutar código personalizado.
Así es como emisor de una clase se vería:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Puede, por bucle curso a través de las cosas:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
y poner el código en si-bloques etc.
la biblioteca de clases se libera en CodePlex aquí:
, así como en NuGet.
El proyecto viene con ejemplos, descargue la fuente o browse it online.
Para responder a las preguntas por correo electrónico también aquí, para que otros puedan ver:
- Todos los tipos de código C# que caben en una llamada al método puede ser compilado en la plantilla. Ejecuta el código normal de C# 3.5, con todo lo que eso significa, no hay límites artificiales. Lo único que debe saber es que cualquier código de if, while, for, foreach, etc. que contenga código de plantilla para emitir debe usar llaves, no puede hacer un bloque de tipo if-then de una sola línea. Vea a continuación la limitación de la llamada al método.
- El parámetro
data
corresponde a lo que se haya pasado como el parámetro para el método .Generate(x)
desde su aplicación, y es del mismo tipo. Si transfiere un objeto que ha definido en sus propias bibliotecas de clase, debe agregar una referencia al código de la plantilla para acceder correctamente.(<%@ reference your.class.library.dll %>
)
- Si reutiliza la plantilla compilada, en esencia solo será una llamada de método a una clase, no se realiza una sobrecarga adicional en la llamada real al
.Generate()
. Si no llama al .Compile()
usted mismo, la primera llamada al .Generate()
se encargará de ello. También tenga en cuenta que el código se ejecuta en un dominio de aplicación separado, por lo que hay una ligera sobrecarga de clasificación relacionada con la copia del parámetro y el resultado de ida y vuelta. El código, sin embargo, se ejecuta a la velocidad normal del código .NET JITted.
Ejemplo de bloque if:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
No hay límites artificiales en el formato del código o bien, escoger el estilo que más le convenga:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
Sólo tenga en cuenta que todas libres las partes del código de la plantilla prácticamente se enviarán tal como están, lo que significa que también se mostrarán las siguientes pestañas y los siguientes bloques %>
.
Hay un límite, todo el código que escriba debe caber dentro de una sola llamada a método.
Déjame explicarte.
La forma en que funciona el motor de plantillas es que produce un archivo .cs y la alimenta al compilador de C#, este archivo de Cs roughyly se parece a esto:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Esto significa que no se pueden definir nuevas clases , nuevos métodos, campos de nivel de clase, etc.
Sin embargo, puede usar delegados anónimos para crear funciones internamente. Por ejemplo, si desea una forma uniforme de las fechas de formato:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
A continuación, puede utilizar que en el resto del código de la plantilla:
<%= date2str(DateTime.Now) %>
Único requisito que tengo es que usted don' Cargue los archivos en la web y afirme que escribió el código. Aparte de eso, puede hacer lo que quiera con él.
Editar 23.04.2011: Vínculos fijos al proyecto CodePlex.
Wooow O.o Estoy descargando esto ahora mismo y le haré saber cómo funciona. Si hace todo lo que dices, ¡serás un absoluto salvavidas! – Amberite
Editó la respuesta ahora, como dijo en el correo electrónico, la variable "Datos" no existe, porque se llama "datos". Es un parámetro de método, de ahí la "d" minúscula. –
"La forma en que funciona el motor de plantilla es que produce un archivo .cs y lo alimenta al compilador de C#": ¿No significaría también que la máquina que ejecuta esto necesita VisStudio o al menos algo más instalado? ¿O hay alguna forma de que llame programáticamente al compilador de C#? No creía que el compilador se enviara con el tiempo de ejecución de .NET ... Aunque como IIS puede compilar ASP.NET sobre la marcha, creo que debe estar en alguna parte ... – CodingWithSpike