Здравствуйте, LWhisper, Вы писали:
LW>Ленивый программист пишет:
есть рефакторинг Create class from method parameters для этого.
Итого 3 действия:
— Alt+Enter create method from usage
— create class from method parameters
— Alt+Enter implement in derived classes
Здравствуйте, qxWork, Вы писали:
W>Итого 3 действия: W>- Alt+Enter create method from usage W>- create class from method parameters W>- Alt+Enter implement in derived classes
Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4.
S>Код в T4 получает на входе имя метода + anonymous type с нужными свойствами. Сгенерить из этого методы в partial-types — минутное дело.
Как ты и написал, это потребует отделить описать модель. Впрочем, я всё ещё рассматриваю этот вариант. Как минимум, он удобнее в плане долгосрочной поддержки.
Здравствуйте, LWhisper, Вы писали:
LW>Как ты и написал, это потребует отделить описать модель. Впрочем, я всё ещё рассматриваю этот вариант. Как минимум, он удобнее в плане долгосрочной поддержки.
Иначе в коде останется 100500 сигнатур, которые больше не нужны.
Здравствуйте, Sinix, Вы писали:
S>Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4.
Ты прав, а экшен implement serializable можно запилить.
Здравствуйте, qxWork, Вы писали:
W>Здравствуйте, Sinix, Вы писали:
S>>Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4. W>Ты прав, а экшен implement serializable можно запилить.
Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась).
Здравствуйте, Sinix, Вы писали:
S>Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась).
Вообще в его примере класс примитивный — он почти весь сам сгенерится, нужно только будет Serializable развесить.
Но механизм на общий случай сделать сложно.
Здравствуйте, LWhisper, Вы писали:
LW>T4 не предлагать.
LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>Хочется иметь полный контроль над формированием текста.
В свое решал похожую задачу для крупной системы и пришел к следующей связке, которая сильно упростила жизнь:
1. Пишем свой extension к студии
2. Внутри используем runtime T4
3. Вызываем генератор там, где нужно, анализируя код Розлином
4. Создание файлов, модификация проекта и прочее доступно через EnvDTE
Преимущества по сравнению с дизайн-тайм Т4:
1. Вся кодогенерация пишется в *.cs файле, как обычный код
2. Можно написать простейшие тесты, которые будут как минимум выводить сгенеренный код на экран
3. Можно пойти дальше и написать реальные тесты, которые будут компилировать код и будут пытаться его выполнить
Здравствуйте, qxWork, Вы писали:
S>>Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась). W>Вообще в его примере класс примитивный — он почти весь сам сгенерится, нужно только будет Serializable развесить. W>Но механизм на общий случай сделать сложно.
Верно, поэтому и хочется иметь ручной контроль над генерируемым кодом.