Amb*_*ite 22 .net c# t4 templates code-generation
我们正在构建一个内部应用程序,需要生成HTML文件以上传到eBay列表中.我们希望使用模板引擎根据我们预定义的数据库和静态字段生成HTML文件.模板还需要具有逻辑功能(if-then,foreach等).
我们已经看过T4并且它看起来很完美,但我们没有看到它是否具有在运行时使用的功能,因此用户可以创建T4模板,然后应用程序可以"编译"它并生成最终的HTML文件.这有可能,怎么样?
如果没有,是否还有其他我们应该关注的具有所有这些功能的框架?
ang*_*son 16
我有一组类似的类用于此,将模板化文本生成嵌入到软件中.
基本上,它的工作方式类似于旧式ASP,<%...%>您可以在块中包含C#代码,并且可以通过使用来发出结果<%= expression %>.
您可以将单个对象传递给模板代码,当然可以是您喜欢的任何对象类型,也可以只是参数数组.如果要执行自定义代码,还可以引用自己的程序集.
以下是发布类的方式:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Run Code Online (Sandbox Code Playgroud)
你当然可以循环:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
并将代码放入if-blocks等.
类库在CodePlex上发布:
以及NuGet.
该项目附带示例,下载源或在线浏览.
也可以通过电子邮件回答问题,供其他人查看:
data参数对应于.Generate(x)从应用程序作为参数传入的任何参数,并且属性相同.如果传入已在自己的类库中定义的对象,则需要添加对模板代码的引用才能正确访问它.(<%@ reference your.class.library.dll %>).Generate().如果你不给.Compile()自己打电话,第一次打电话.Generate()就会照顾好.另请注意,代码在单独的appdomain中运行,因此有一个轻微的编组开销与复制参数和结果来回相关.但是,代码以正常的JITted .NET代码速度运行.if-block示例:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
Run Code Online (Sandbox Code Playgroud)
格式化代码也没有人为限制,选择最适合您的样式:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
Run Code Online (Sandbox Code Playgroud)
只需注意模板的所有非代码部分几乎都按原样输出,这意味着%>也会输出制表符和后续块.
有一个限制,您编写的所有代码必须适合单个方法调用.
让我解释.
模板引擎的工作方式是它生成.cs文件并将其提供给C#编译器,这个.cs文件粗略地看起来像这样:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着您无法定义新类,新方法,类级字段等.
但是,您可以使用匿名委托在内部创建函数.例如,如果您想要一种统一格式化日期的方法:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
Run Code Online (Sandbox Code Playgroud)
然后你可以在其余的模板代码中使用它:
<%= date2str(DateTime.Now) %>
Run Code Online (Sandbox Code Playgroud)
只有我的要求是你没有将文件上传到网上并声称你编写了代码,除了你可以随意做你想做的事情.
编辑23.04.2011:修复了CodePlex项目的链接.
Gar*_*thJ 14
如果您可以使用Visual Studio 2010进行模板创建和编辑,则可以使用预编译模板,这些模板专为此方案而设计,并且是Microsoft支持的选项.
您在Visual Studio中设计模板,预编译它并部署一个与您的应用程序一起不依赖Visual Studio的程序集.
http://www.olegsych.com/2009/09/t4-preprocessed-text-templates/
实现T4文本转换的程序集是Microsoft.VisualStudio.TextTemplating.dll,它随Visual Studio一起提供.
如果您想从第一原则开始,则需要实现Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost,并将其实现作为参数传递给Microsoft.VisualStudio.TextTemplating.Engine.ProcessTemplate(),它将执行转换.
这比调用TextTransform.exe更灵活.
但是,如果您的代码是发货产品,则不清楚此程序集的许可是什么,以及您是否有权使用您的应用程序重新分发它.
重新分发此程序集将避免安装Visual Studio.