2010-04-19 3 views
2

У меня есть dll, который я разбираю в Reflector, затем создаю класс. Класс содержит код, который не компилируется в Visual Studio.Reflector и код сгенерированный компилятором

Я считаю, что это IL-код, но как я могу сгенерировать более высокий уровень C#.

Кажется, доходность и IEnumerator генерируют такие вещи, как <>1__state; в IL, которые не будут компилироваться.

Кто-нибудь знает, как я могу сгенерировать класс из отражателя, который содержит этот тип ИЛ?

Есть ли отражатель, который разрешит это?

private sealed class <Rule_Document>d__0 : IEnumerable<HtmlTag>, IEnumerable, IEnumerator<HtmlTag>, IEnumerator, IDisposable 
    { 
     private int <>1__state; 
     private HtmlTag <>2__current; 
     public HtmlParser <>4__this; 
     private int <>l__initialThreadId; 
     public HtmlTag <htmlTag>5__1; 
+3

Кажется, что, начиная с C# 3.0, вам больше не нужно запутывать свой код :-) –

+0

Это может быть ошибка рефлектора. – Svisstack

+3

Это не ошибка. – SLaks

ответ

7

Этот ИЛ из блока итератора. Итераторы horrible для записи вручную, а базовый IL из блока итератора является свидетельством реальности того, что делает компилятор для вас. Будьте благодарны вам не нужно было это делать самостоятельно!

Вы могли бы попробовать сдавать это вместе в основном из MoveNext(), но не ожидайте чудес. Вы также можете обнаружить, что переименование полей (чтобы избавиться от таких вещей, как префиксы <>) идет долгий путь.

Однако; Я ожидать лучшее, что нужно сделать, это понять, что код пытается сделать, и не пытаться просто украсть заем их реализации.

+0

+1, я согласен. Если автор кода хотел, чтобы другие люди читали/изменяли его, он просто освобождал исходный код. –

+0

@Marc Gravell: Просто займитесь, чтобы попытаться понять их реализацию. Я бы не украл у Microsoft ... – mike

+0

@ user291320 - в зависимости от того, какой фрагмент кода, отладочные символы могут быть бесплатными (по лицензии). –