我可以使用Roslyn进行编译时代码重写吗?

时间:2011-10-20 09:38:25

标签: c# metaprogramming compiler-as-a-service roslyn

例如我有

class Foo: INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    public int Bar {get;set;}
}

我可以获得Foo类AST并在编译时将Bar重写为

    public string Bar
    {
        get { return this.bar; }

        set 
        {
            if (value != this.bar)
            {
                this.phoneNumberValue = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Bar"));
            }
        }
    }

2 个答案:

答案 0 :(得分:16)

今天Roslyn并不直接支持编译时重写,但语法和语义转换肯定是。实际上,请查看CTP中包含的“ImplementNotifyPropertyChanged”示例,以查看您要执行的操作。该示例在IDE功能中实现为设计时转换,但您可以提取逻辑并使其成为类似于在编译之前重写文件的预构建任务。

答案 1 :(得分:2)

我不认为这在当前已发布的CTP中是可能的,因为编译器作为服务存在但是没有这样的东西可以让你像在Nemerle中那样插入编译过程。