Я знаю, что дженерики находятся в 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 ) );
}
Вы можете использовать T4.
EDIT: В вашем примере можно использовать простой параметр bool
.
В дополнение к отличным предложениям Марка, вы можете взглянуть на PostSharp.
Generics действительно работает как шаблоны, если это так. Есть способ создания кода во время выполнения -
Проверьте CodeProject Пример:
Я проделал несколько трюков в стиле метапрограммирования, используя статические обобщения, использующие отражение (а теперь я использую генерацию динамического кода с помощью 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 (или написал свой собственный инструмент, но это немного тяжеловато). Если нет, то может помочь статический универсальный шаблон, возможно, в партнерстве с решениями, упомянутыми Марком.
Если вы хотите Настоящая генерация кода, вы можете использовать CodeSmith http://www.codesmithtools.com , который не является бесплатным / не входит в комплект, как T4, но имеет некоторые дополнительные функции и может работать как подключаемый модуль VS.NET .
Вот старая статья, в которой генетическое программирование используется для генерации и компилировать код на лету:
http://msdn.microsoft.com/en-us/magazine/cc163934.aspx
«Класс Generator является ядром приложения генетического программирования. Он обнаруживает доступные терминалы базового класса. Он генерирует, компилирует и выполняет код C # для поиска хорошего решения поставленной проблемы. Конструктору передается System.Type, который является корневым классом для операций отражения .NET »
. излишний для вашей ситуации, но показывает, на что способен C #. (Обратите внимание, что эта статья относится к 1.0 дням)
Не совсем так, насколько я знаю. Вы можете делать такие вещи во время выполненияruntime, конечно; несколько вариантов мета-программирования, ни один из них не тривиален: