2011-10-20 112 views
14

比如我有我可以使用Roslyn編譯時代碼重寫嗎?

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

我能得到Foo類AST和重寫酒吧,在編譯的時候,要

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

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

+1

僅供參考,您可以通過此https://github.com/SimonCropp/Fody – Simon

+1

執行此操作該代碼的位置已移動。它現在在[github.com/Fody/Fody](http://github.com/Fody/Fody) – JKor

回答

15

今天,Roslyn不直接支持編譯時重寫,但語法和語義轉換肯定是。實際上,請查看CTP中包含的「ImplementNotifyPropertyChanged」示例,以瞭解您想要執行的操作。該示例是作爲設計時間轉換和IDE功能實現的,但是您可以提取邏輯並將其製作爲類似預編譯任務的內容,以便在編譯之前重寫文件。

+3

Ivan Towlson也發表了關於自動'DependencyProperty'實現的博客 - http://www.mindscapehq.com/blog/index .php/2011/10/20/in-bed-with-roslyn/ –

+0

現在在2014年2。5年後:這個答案仍然正確嗎? – jeromerg

+0

是的。我們故意不構建編譯鉤子,因爲我們希望看到社區構建什麼類型的東西以及首先出現什麼樣的場景,以便我們可以在/如果/當時構建* right *鉤子。 –

2

我不認爲這是可能的在當前已發佈的CTP作爲編譯器是作爲服務,但沒有這樣的事情可以讓你插入到編譯過程,你可以在Nemerle做。

相關問題