2015-08-23 18 views
0

Мне недавно пришлось сделать проработку для декомпиляции кода коллеги, пока они отсутствовали, и обнаружили, что большинство из них выглядит удивительно красиво (спасибо ILSpy), за исключением нескольких мест, где нам нужно было использовать dynamic - они получили искаженные на несколько частей:Что означает синтаксис при декомпиляции динамических операций C#?

  1. контейнерной площадки вызова - то есть то, что напоминает класс в определении, но, скажем, метод, в котором был использован dynamic был DoStuff, будет иметь декларацию вдоль линий public /* static? I forget */ class <DoStuff>CallSiteContainer_Plus_Some_Weirdness { /* bunch of CallSite fields */ }
  2. Много кода, который проверяет, были ли назначены различные CallSites в контейнере и назначает их перед использованием в качестве requi красный, используя подходы, которые я действительно еще не понял.

Мой вопрос касается синтаксиса объявления класса в 1-й точке. Это выглядит как как общий класс, но это явно не так. Может ли кто-нибудь объяснить, что там происходит?

Обратите внимание: я не ищу помощь в разработке исходного кода. Я уже успел это сделать, разумно используя поиск и замену, а также вырвать автогенерированный код из всего остального. Но я хотел бы понять, как синтаксис контейнера CallSite является допустимым именем класса!

+0

Извините заранее за отсутствие полного образца кода - машина, о которой я прошу, не имеет VS. Если я получу шанс, я обновлю вопрос на правильном примере в неделю. Достаточно сказать, что вы можете получить тот же эффект, выполнив простой вызов динамического объекта и декомпилировав метод с помощью ILSpy. – tobriand

+0

Из того, что я вижу (только из кода IL) - нет класса, который вы описываете. 'System.Runtime.CompilerServices.CallSite.Create' - это просто метод, который позволяет динамически вызывать метод на объекте посредством отражения. Может быть, это «ILSpy», пытаясь понять это? Но из того, что я тестировал, есть просто вызовы 'CallSite', и ни один из этих сгенерированных классов. – Rob

+0

Достаточно справедливо ... так что на самом деле это, вероятно, всего лишь случай нажатия на пределы декомпилятора. Мне удалось найти ссылку на контейнер сайта вызова в образцах Google Books для 'C# 4.0 Unleashed', поэтому он предположил, что это законный синтаксис (но объяснение просто не было включено в образец). В любом случае, вставьте образец в неделю, чтобы другие могли хотя бы увидеть, о чем я говорю. – tobriand

ответ

1

Вот пример такого авто сгенерированного класса:

private static class <>o__0 
{ 
    public static CallSite<Action<CallSite, Type, object>> <>p__0; 
} 

Если вы беспокоитесь об имени <>o__0 класса и имени <>p__0 поля, то вы правы, это не те действительные имен C#, но это Безразлично 't означает, что они не являются действительными именами IL, которые генерирует компилятор. Причина, почему он использует такие специальные символы, заключается в том, чтобы они никогда не конфликтуют с именами классов, которые вы, как разработчик, могли написать.