是否有任何语言具有模板代码形式?让我解释一下我的意思......我今天正在研究一个C#项目,其中我的一个类是非常重复的,一系列属性的getter和setter。
public static int CustomerID
{
get
{
return SessionHelper.Get<int>("CustomerID", 0); // 0 is the default value
}
set
{
SessionHelper.Set("CustomerID", value);
}
}
public static int BasketID
{
get
{
return SessionHelper.Get<int>("BasketID", 0); // 0 is the default value
}
set
{
SessionHelper.Set("BasketID", value);
}
}
... and so forth ...
我意识到这可能基本上分为类型,名称和默认值。
我看到这篇文章,与我想象的类似,但没有参数空间(默认)。
但我在想,有很多时候代码会分解成模板。
例如,语法可以这样:
public template SessionAccessor(obj defaultValue) : static this.type this.name
{
get
{
return SessionHelper.Get<this.type>(this.name.ToString(), defaultValue);
}
set
{
SessionHelper.Set(this.name.ToString(), value);
}
}
public int CustomerID(0), BasketID(0) with template SessionAccessor;
public ShoppingCart Cart(new ShoppingCart()) with template SessionAccessor; // Class example
我觉得在编写简洁,干燥的代码时会有很多可能性。这种类型的东西在使用反射的c#中可以实现,但是这很慢,这应该在编译期间完成。
所以,问题:在任何现有的编程语言中,这种功能是否可行?
答案 0 :(得分:9)
... aand你发现了metaprogramming的奇妙世界。欢迎! : - )
原型元编程语言是Lisp,或者实际上可以在代码中表示其自身结构的任何其他语言。
其他语言试图在某种程度上复制它; macros in C是一个突出的例子。
最近在某种程度上支持这种语言的着名候选人是C++ via its templates和Ruby。
答案 1 :(得分:9)
正如Marc Gravell评论的那样,T4 (Text Template Transformation Toolkit)是一个简单的工作,它是一个集成在Visual Studio中的模板处理器,可以与C#或VB一起使用,并且可以生成任何内容。它是一种工具,而不是内置语言功能。
向项目添加文本模板文件(.tt),模板将如下所示:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".generated.cs" #>
<#
var properties = new[] {
new Property { Type = typeof(int), Name = "CustomerID", DefaultValue = 0 },
new Property { Type = typeof(int), Name = "BasketID", DefaultValue = 0 },
};
#>
namespace YourNameSpace {
public partial class YourClass {
<# foreach (Property property in properties) { #>
public static <#= property.Type.FullName #> <#= property.Name #> {
get { return SessionHelper.Get<<#= property.Type.FullName #>>("<#= property.Name #>", <#= property.DefaultValue #>); }
set { SessionHelper.Set("<#= property.Name #>", value); }
}
<# } #>
}
}
<#+
public class Property {
public Type Type { get; set; }
public string Name { get; set; }
public object DefaultValue { get; set; }
}
#>
T4非常适合这种代码生成。我强烈建议T4 Toolbox为每个模板轻松生成多个文件,访问EnvDTE直接在Visual Studio中解析现有的C#代码和其他优点。