2011-10-20 15 views
14

Na przykład mamCzy mogę użyć Roslyn do kompilacji przepisywania kodu czasu?

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

mogę uzyskać Foo klasy AST i przepisać Bar, w czasie kompilacji, aby

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

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

.

+1

FYI możesz to zrobić dzisiaj dzięki https://github.com/SimonCropp/Fody – Simon

+1

Lokalizacja tego kodu została przeniesiona. To jest teraz w [github.com/Fody/Fody](http://github.com/Fody/Fody) – JKor

Odpowiedz

15

Ponowne pisanie na czas kompilacji nie jest bezpośrednio obsługiwane przez Roslyn, ale zdecydowanie są to syntaktyczne i semantyczne transformacje. W rzeczywistości przyjrzyj się przykładowi "ImplementNotifyPropertyChanged" zawartemu w CTP, aby zobaczyć coś, co chcesz zrobić. Przykład jest zaimplementowany jako transformacja czasu projektowania i funkcja IDE, ale można wyodrębnić logikę i przekształcić ją w coś w rodzaju zadania wstępnego kompilacji, które przepisuje pliki przed kompilacją.

+3

Ivan Towlson również blogował o automatycznej implementacji 'DependencyProperty' - http://www.mindscapehq.com/blog/index .php/2011/10/20/in-bed-with-roslyn/ –

+0

teraz w 2014 r., więc 2,5 roku później: czy ta odpowiedź jest nadal poprawna? – jeromerg

+0

Tak. Zasadniczo NIE budujemy jeszcze kompilacji, ponieważ chcielibyśmy zobaczyć, co tworzy społeczność i jakie scenariusze powstają jako pierwsze, abyśmy mogli zbudować * właściwe * haki, jeśli/kiedy to zrobimy. –

2

Nie sądzę, że jest to możliwe w bieżącym CTP, który został wydany, ponieważ kompilator jest tam jako usługa, ale nie ma czegoś takiego, co pozwala podłączyć proces kompilacji, jak to jest możliwe w Nemerle.

Powiązane problemy