C# 有没有使用代码模板的语言?

C# 有没有使用代码模板的语言?,c#,templates,programming-languages,metaprogramming,C#,Templates,Programming Languages,Metaprogramming,有没有任何语言具有代码模板的形式?让我解释一下我的意思。。。今天我在做一个C#项目,在这个项目中,我的一个类是非常重复的,一系列的属性getter和setter public static int CustomerID { get { return SessionHelper.Get<int>("CustomerID", 0); // 0 is the default value }

有没有任何语言具有代码模板的形式?让我解释一下我的意思。。。今天我在做一个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 static int CustomerID
{
得到
{
return SessionHelper.Get(“CustomerID”,0);//0是默认值
}
设置
{
Set(“CustomerID”,值);
}
}
公共静态整数篮
{
得到
{
return SessionHelper.Get(“BasketID”,0);//0是默认值
}
设置
{
SessionHelper.Set(“BasketID”,值);
}
}
... 等等
我意识到这基本上可以分解为一个类型、一个名称和一个默认值

我看到了这篇文章,它与我的设想类似,但没有参数空间(默认设置)

但我在想,很多时候代码会分解成模板

例如,语法可以是这样的:

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
public template SessionAccessor(obj defaultValue):静态this.type this.name
{
得到
{
返回SessionHelper.Get(this.name.ToString(),defaultValue);
}
设置
{
SessionHelper.Set(this.name.ToString(),value);
}
}
public int CustomerID(0),BasketID(0),带模板SessionAccessor;
带有模板SessionAccessor的公共ShoppingCart(新ShoppingCart())//课例
我觉得这在编写简洁、枯燥的代码方面有很多可能性。这种类型的事情在c#with reflection中是可以实现的,但是速度很慢,应该在编译过程中完成


所以,问题是:在任何现有的编程语言中,这种类型的功能都是可能的吗?

..a您已经发现了计算机的奇妙世界。欢迎!:-)

原型元编程语言是,或者实际上是任何其他可以在代码中表示其自身结构的语言

其他语言在某种程度上也试图复制这一点;这是一个突出的例子


在某种程度上支持这一点的最新突出的候选语言是和。

正如Marc Gravell所评论的,这是一项简单的工作,它是集成在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; }
}
#>

名称空间YourNameSpace{
公共部分类{
公共静电{
get{return SessionHelper.get(“,);}
set{SessionHelper.set(“,value);}
}
}
}

T4非常适合这种代码生成。我强烈建议每个模板轻松地生成多个文件,访问EnvdTE,直接在VisualStudio中解析现有的C++代码和其他的优缺点。

听起来像是T4的一个工作,……C++有一些模板,这些模板与你想要的东西很接近:如果你的首要考虑是进入样板的繁琐性。(而且不可能在样板文件中进行更改),Resharper有一个很好的Live Templates功能,可以帮助您实现这一点。T4功能更强大(您可以更新模板定义并使用更新的模板重新生成文件)VANILA VS有代码片段,这也可以帮助。看看一个好的启动博客:FYI;T4可以生成C,C++,C,ObjvEC,XML,基本上任何文本。它节省了我几个月的冗长乏味可怕的重复性工作。