Использование реального мира Отражения. Испустить

Во всех книгах я читал на отражении, они часто говорят, что нет многих случаев, где Вы хотите генерировать IL на лету, но они не дают примеров того, где это действительно имеет смысл.

После наблюдения Отражения. Испустите как требование задания для компании-разработчика игр, мне было любопытно, где еще это используется.

Я теперь задаюсь вопросом, существуют ли какие-либо ситуации, Вы видели в реальном мире, было это, было лучшее решение проблемы. Возможно, это используется в качестве реализации к шаблону разработки?

Обратите внимание, что я воображаю PostSharp / AOP использует его.

40
задан 3 revs 22 February 2010 в 17:30
поделиться

11 ответов

Expression.Compile по существу делает это - это ключ к некоторым LINQ.

В настоящее время я использую reflection emit, чтобы переписать API сериализации - потому что иногда отражение просто недостаточно хорошо. Как оказалось, это также позволит ему генерировать dll (подобно тому, как работает sgen), позволяя полностью статический код (я надеюсь, что это сделает его дружественным к iPhone).

Я также использую похожий подход в HyperDescriptor, чтобы обеспечить очень быстрый поиск свойств по имени.

Я также использовал emit для таких вещей, как:

все, что связано с вопросами SO.

Наконец, этот IL подход является основой protobuf-net "v2"; причина здесь в том, что он позволяет мне как иметь быструю модель во время выполнения (компилируя ее через IL на лету), так и писать то же самое непосредственно в статически скомпилированную dll, чтобы она работала на таких вещах, как iPhone, Phone 7 и т.д. (в которых отсутствуют необходимые API мета-программирования).

14
ответ дан 27 November 2019 в 01:43
поделиться
1
ответ дан 27 November 2019 в 01:43
поделиться

XMLSerializer фактически генерирует код и компилирует его при первом запуске. Вы можете прочитать эту замечательную статью в блоге на сайте Скотта Хансельмана о том, как отладить XML Serialization, если вы знаете, что это происходит.

2
ответ дан 27 November 2019 в 01:43
поделиться

Я помню, что видел Relection.Emit , использованный в главе 8: «Генерация кода на лету для обработки изображений» Beautiful Code . В основном автор специализируется на функции для выполнения определенного набора операций обработки изображения с данным изображением, что, в свою очередь, приводит к значительному сокращению времени выполнения.

4
ответ дан 27 November 2019 в 01:43
поделиться

Языки, связанные с DLR и DLR, в значительной степени полагаются на Reflection.Emit

6
ответ дан 27 November 2019 в 01:43
поделиться

Castle DynamicProxy использует его для, как вы догадываетесь, динамических прокси. Затем DynamicProxy используется контейнером IoC Castle Windsor и сопоставителем ActiveRecord.

7
ответ дан 27 November 2019 в 01:43
поделиться

Я использую его как способ создания динамических прокси на лету для обертывания класса. NHibernate использует этот же шаблон для прокси-вызовов к объектам POCO, чтобы вместо этого запрашивать базу данных.

Каждый раз, когда вы хотите иметь возможность «писать код» (т.е. создавать новую функцию и т. Д.) Динамически, вам понадобится Emit .

8
ответ дан 27 November 2019 в 01:43
поделиться

Убедитесь, что вы используете DisableControls/EnityControls, если это не требуется для того, чтобы не тратить время на обновление видимых элементов управления, связанных с DataSet.

try
  ADOQuery1.DisableControls;
  while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;
finally
  ADOQuery1.EnableControls;
end;

С уважением.

-121--3545634-

Это вопрос ГИС, который не будет легко решен, если вы не используете надлежащие инструменты.

  • Используйте QGIS , чтобы открыть Данные файла формы США

    EDIT В случае, если файлы формы, на которые я ссылался, не совсем те, которые вы искали тогда Google для «файлов формы США». Shapefile на самом деле группа геопространственных (а не только один файл).

  • Повторно проецировать слой на указанную проекцию

    EDIT это может быть затруднением, но на всякий случай он не может перепроектировать (см. ниже). EPSG получены из пространственной ссылки

  • Используйте ogr2ogr ( cheatsheet ) или плагин конвертера для преобразования данных в KML. Эти данные будут выведены в формате Google maps/earth/human, который будет иметь координаты в них

EDIT 2 Что вы используете для отображения онлайн-карт? рассматривали ли вы открытые слои или Google maps API или mapserver

EDIT 3 Я протестировал свой метод на некоторых данных, которые у меня есть, и он работает, вот пример вывода для одного полигона с использованием уровня «Состояние и эквивалент (ток)»:

<Placemark>
      <name>American Samoa</name>
      <styleUrl>#PolyStyle00</styleUrl>
      <Snippet></Snippet>
      <MultiGeometry>
        <Polygon>
          <tessellate>1</tessellate>
          <extrude>0</extrude>
          <altitudeMode>clampToGround</altitudeMode>
          <outerBoundaryIs><LinearRing><coordinates> -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000100,0.000000 -0.001536,-0.000100,0.000000 -0.001536,-0.000100,0.000000 -0.001536,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000100,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001537,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000 -0.001536,-0.000099,0.000000</coordinates>
            </LinearRing>
          </outerBoundaryIs>
        </Polygon>
-121--2583738-

Библиотеки насмешек также используют Reflection.Emit для создания прокси-серверов, используемых в модульном тестировании.

2
ответ дан 27 November 2019 в 01:43
поделиться

Динамическое генерирование имитационного объекта, который реализует некоторый интерфейс. Примеры фреймворков, которые это делают: moq, rhino mocks.

13
ответ дан 27 November 2019 в 01:43
поделиться

Недавно я использовал его для создания доказательства концепции компиляции набора операций, которые очень дорого выполнять во время выполнения, и добился 200% улучшения скорости. Операции заключались в использовании RegEx для разбора большой строки и циклическом переборе совпадений, использовании Reflection для поиска и инстанцирования типов и множества других не очень быстрых вещей. Используя IL emit, я создал динамические функции, которые соответствовали типу делегата (используя DynamicMethod) и кэшировал их. Я выполнил обычный танец RegEx/Reflection один раз для каждого входного значения, чтобы выяснить, что оно должно делать, затем использовал StringBuilder для объединения строк как литералов, и вместо Reflection/Activator я теперь мог использовать сами типы в эмулируемом IL. Вот полезный совет: не пытайтесь писать IL самостоятельно, если только вы не садо-мазохист. Напишите пример функции или типа на C#, который делает то, что вы хотите, скомпилируйте его и используйте Reflector или ILDASM, чтобы увидеть сгенерированный IL. Затем используйте Emit для выполнения аналогичной логики. Еще один совет - вы можете создавать локали и сохранять их в переменных, затем использовать Emit(OpCodes.Ldloc, myLocalVar) и он получит локальный адрес для вас, вместо того, чтобы отслеживать индекс локали (т.е. ldloc_1).

2
ответ дан 27 November 2019 в 01:43
поделиться

Я использовал его в приложении, где к свойству приходилось многократно обращаться через отражение (потому что имя свойства не было известно во время компиляции).

Благодаря созданию вспомогательного класса во время выполнения, который генерирует код для доступа к свойству, полученный код был на порядок быстрее, чем исходный код, предназначенный только для отражения.

3
ответ дан 27 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: