2011-10-20 12 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

FYIこれは今日この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

はい。私たちは、コンパイルフックをまだ作っていません。コミュニティが構築するものと、シナリオが最初に出現するものを見て、私たちが*正しい*フックを構築できるようにしたいのです。 –

2

コンパイラがサービスとして存在しているが、Nemerleでできるようにコンパイルプロセスにプラグインできるようなことはないので、これは現在のCTPでは可能ではないと思う。

関連する問題