Шаблоны в C#

Я знаю, что дженерики находятся в C# для выполнения роли, подобной шаблонам C++, но мне действительно нужен способ сгенерировать некоторый код во время компиляции - в этой конкретной ситуации, было бы очень легко решить проблему с шаблонами C++.

Кто-либо знает о каких-либо альтернативах? Возможно, плагин VS, который предварительно обрабатывает код или что-то как этот? Это не должно быть очень сложно, я просто должен генерировать некоторые методы во время компиляции.

Вот очень упрощенный пример в C++ (обратите внимание, что этот метод назвали бы в жестком цикле с различными условиями вместо просто "Усовершенствованного", и те условия изменятся только однажды на кадр - использование if's было бы слишком медленным и писало бы, что все альтернативные методы вручную будет невозможно поддержать). Также обратите внимание, что производительность очень важна, и вот почему мне нужно это, чтобы быть сгенерированным во время компиляции.

template <bool Advanced>
int TraceRay( Ray r )
{
    do
    {
        if ( WalkAndTestCollision( r ) )
        {
            if ( Advanced )
                return AdvancedShade( collision );
            else
                return SimpleShade( collision );
        }
    }
    while ( InsideScene( r ) );
}
6
задан John Doe 4 May 2010 в 21:46
поделиться

7 ответов

Вы можете использовать T4.

EDIT: В вашем примере можно использовать простой параметр bool.

9
ответ дан 10 December 2019 в 00:35
поделиться

В дополнение к отличным предложениям Марка, вы можете взглянуть на PostSharp.

0
ответ дан 10 December 2019 в 00:35
поделиться

Generics действительно работает как шаблоны, если это так. Есть способ создания кода во время выполнения -

Проверьте CodeProject Пример:

CodeProject

0
ответ дан 10 December 2019 в 00:35
поделиться

Я проделал несколько трюков в стиле метапрограммирования, используя статические обобщения, использующие отражение (а теперь я использую генерацию динамического кода с помощью System.Linq. Выражения; а также использование ILGenerator для еще нескольких безумных вещей). http://www.lordzoltan.org/blog/post/Pseudo-Template-Meta-Programming-in-C-Sharp-Part-2.aspx для примера, который я собрал (извините за отсутствие форматирования кода - это очень старый пост!), который может пригодиться.

Я также использовал T4 (ссылка ведет на серию руководств моего любимого авторитета по T4 - Олега Сича), как было предложено SLaks - это действительно хороший способ создания кода, особенно если вам нравится синтаксис в стиле Asp.Net. Если вы генерируете частичные классы с использованием выходных данных T4, тогда разработчик может приукрасить и добавить к классу, как он сочтет нужным.

Если это абсолютно необходимо во время компиляции - я бы выбрал T4 (или написал свой собственный инструмент, но это немного тяжеловато). Если нет, то может помочь статический универсальный шаблон, возможно, в партнерстве с решениями, упомянутыми Марком.

0
ответ дан 10 December 2019 в 00:35
поделиться

Если вы хотите Настоящая генерация кода, вы можете использовать CodeSmith http://www.codesmithtools.com , который не является бесплатным / не входит в комплект, как T4, но имеет некоторые дополнительные функции и может работать как подключаемый модуль VS.NET .

0
ответ дан 10 December 2019 в 00:35
поделиться

Вот старая статья, в которой генетическое программирование используется для генерации и компилировать код на лету:

http://msdn.microsoft.com/en-us/magazine/cc163934.aspx

«Класс Generator является ядром приложения генетического программирования. Он обнаруживает доступные терминалы базового класса. Он генерирует, компилирует и выполняет код C # для поиска хорошего решения поставленной проблемы. Конструктору передается System.Type, который является корневым классом для операций отражения .NET »

. излишний для вашей ситуации, но показывает, на что способен C #. (Обратите внимание, что эта статья относится к 1.0 дням)

0
ответ дан 10 December 2019 в 00:35
поделиться

Не совсем так, насколько я знаю. Вы можете делать такие вещи во время выполненияruntime, конечно; несколько вариантов мета-программирования, ни один из них не тривиален:

  • reflection (самый простой вариант, если вам не нужно "как можно быстрее")
  • CSharpCodeProvider и некоторая генерация кода
  • то же самое с CodeDom
  • ILGenerator, если вам нужен хардкор
1
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

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