Обобщения в стиле макросов C # - PullRequest
4 голосов
/ 23 мая 2011

Я ищу способ иметь дженерики, которые существуют только во время компиляции с целью повторного использования кода: не нужно копировать / вставлять классы и методы.Просто замена текста в основном, как макросы, с некоторыми проверками типов.Больше похоже на шаблоны C ++.

Причина, по которой я спрашиваю:

Обычные шаблоны C # настаивают на постоянном создании универсальных типов во время выполнения (почему ??), что

1) не только создает ненужные ограничения (например, не может наследовать от параметра типа, что было бы очень полезно),

2), но и эти универсальные типы во время выполнения создают проблемы для меня прямо сейчас, потому что .NET не может их сериализоватьпоэтому, когда я вставляю их в RichTextBox, многие операции либо завершаются сбоем, либо выдают исключение «Невозможно сериализовать универсальный тип».Все работало с неуниверсальными типами, но я хотел сделать код более общим, чтобы добавить что-то, поэтому я добавил генерики ( C # Обход обхода универсального наследования ), и они ломают все.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 мая 2011

Хотя в C # нет шаблонов в стиле C ++, вы можете попробовать T4 (набор инструментов преобразования текстовых шаблонов) , чтобы имитировать их.

Ваш файл будет выглядеть примерно так:

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
    foreach (var T in new[]{"instantiate","for","these","types"})
    {
#>      

class FakeGeneric<#=T#>
{
    <#=T#> FakeGenericField;
}

<#  } #> 

Это создаст такие типы:

class FakeGenericinstantiate
{
    instantiate FakeGenericField;
}

class FakeGenericfor
{
    for FakeGenericField;
}

// etc

На MSDN есть страница, посвященная использованию T4 для генерации кода , подобного этому.

1 голос
/ 23 мая 2011

Они называются шаблонами (не "обобщениями в стиле макроса"), и они не существуют в C #.

Взгляните на D если вам интересно;у него есть много возможностей метапрограммирования шаблонов, больше (и IMO лучше, чем) C ++ или C #.

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