Существует ли какой-либо отраслевой «стандарт» для расширенного метапрограммирования на c #?

#c# #.net #metaprogramming #preprocessor

#c# #.net #метапрограммирование #препроцессор

Вопрос:

Время от времени в различных проектах я сталкиваюсь с ситуацией метапрограммирования в проекте C #, которая не может быть решена с помощью дженериков, и было бы полезно использовать более мощный инструмент метапрограммирования. Решения, которые я обычно использую, заключаются либо в том, чтобы обойти проблему с отражением, использовать C / cli, либо ввести пользовательский этап компиляции xml / xslt.

Отражает ли это подходы, принятые сообществом C # в целом, или есть стоящий подход, такой как широко используемый сторонний препроцессор, о котором я не знаю?

Я не прошу рекомендации по продукту, я спрашиваю об устоявшемся общем решении этой распространенной проблемы. «Нет, не существует» может быть допустимым и корректным ответом.

Комментарии:

1. widely used 3rd party preprocessor Шаблоны T4 ?

2. postsharp.net возможно?

Ответ №1:

Это признанный пробел, который годами часто откладывался в долгий ящик, потому что .NET имеет очень хорошие API-интерфейсы reflection / emit во время выполнения, позволяющие использовать решения для метапрограммирования во время выполнения; однако это сопряжено с множеством проблем, в том числе:

  1. сложность
  2. время запуска
  3. последствия для безопасности
  4. работает не во всех сценариях (некоторые среды выполнения / платформы запрещают эмиссию во время выполнения)
  5. проблемы с компоновщиками IL, удаляющими код, который «не используется» (потому что во время сборки ничто не затрагивает эти API, но во время выполнения они используются через отражение / излучение во время выполнения)

Из-за этого во временных рамках C # 9 (но не специфичных для C # 9) «генераторы», похоже, наконец-то становятся «вещью». Это обеспечивает уровень метапрограммирования на основе Roslyn во время сборки, который может быть расширен аналогично тому, как библиотеки сторонних производителей могут поставлять «анализаторы» сегодня (генераторы и анализаторы принципиально похожи).

Возможно, это и есть тот «отраслевой стандарт», который вы ищете, но он находится в зачаточном состоянии. Вступительный пост от апреля 2020 года.

Ответ №2:

Нет, не существует. В основном потому, что это второстепенное поле. НЕ говорю, что это бесполезно, просто говорю, что от 90% до 95% людей просто этого не делают.

Есть 2 технологии, используемые «широко» (частично потому, что некоторые .СЕТЕВЫЕ инструменты, в основном в EntityFramework) использовали их):

Я бы сказал, что из вариантов использования 95% — это T4, и это в основном старый редактор Ef 4, который сейчас постепенно заменяется клиентскими генераторами для различных API — да, метапрограммирование — это такая редкость. Я нахожу это отчасти позорным. Время от времени я использовал генераторы кода (маршрутизация на основе odata, T4 для ASP.NET в те далекие времена), но в большинстве случаев другие разработчики смотрят на это широко раскрытыми глазами и даже никогда не слышали об этой концепции. Позор.

Итак, определенно никакого стандарта не существует.

Ответ №3:

Существует много способов использования метапрограммирования в .NET.

  • Инструменты времени компиляции: PostSharp, Fody и т. Д
  • Инструменты среды выполнения: Castle DynamicProxy, перехват Unity и т. Д
  • Инструменты генерации кода: T4, генераторы исходного кода

Но ни один из них не является стандартным.

Также рассмотрите возможность перехода на другой язык программирования, например, Nemerle. Это язык, который поддерживает гигиеничные макросы. По моему личному мнению, это идеал метапрограммирования.