Шаблоны в C # - PullRequest
       4

Шаблоны в C #

6 голосов
/ 05 мая 2010

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

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

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

template <bool Advanced>
int TraceRay( Ray r )
{
    do
    {
        if ( WalkAndTestCollision( r ) )
        {
            if ( Advanced )
                return AdvancedShade( collision );
            else
                return SimpleShade( collision );
        }
    }
    while ( InsideScene( r ) );
}

Ответы [ 7 ]

9 голосов
/ 05 мая 2010

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

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

1 голос
/ 05 мая 2010

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

  • отражение (самый простой вариант, если вам не нужно "как можно быстрее")
  • CSharpCodeProvider и некоторая генерация кода
  • то же самое с CodeDom
  • ILGenerator, если вы хотите хардкор
0 голосов
/ 05 мая 2010

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

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

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

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

0 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

Я сделал несколько трюков в стиле метапрограммирования с использованием статических обобщений, использующих отражение (и теперь я использую динамическую генерацию кода с использованием System.Linq.Expressions; а также использовал 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 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

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

Проверка - это CodeProject Пример:

CodeProject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...