Расширение синтаксиса С# с roslyn
Я пытаюсь реализовать "return if" / "return value if" без случая else, так как я хочу только вернуть или вернуть значение, если условие действительно.
Я знаю, что есть if (condition) return;
или if (condition) return value;
, но я хочу, чтобы код был немного чистым, и было бы неплохо иметь этот синтаксис, поскольку он более читабельен.
Я слышал с roslyn, это возможно и прочитал вопрос с его ответами здесь: Есть ли способ реализовать пользовательские языковые функции на С#?, но у меня нет подсказки как его реализовать.
Итак, код будет примерно таким:
public class Testclass
{
public static void Main(String[] args)
{
Testclass t = new Testclass();
t.TestMyClassWithVoid();
bool success = t.TestMyClassWithInt(3) == 3;
bool fail = t.TestMyClassWithInt(2) == 2;
}
public void TestMyClassWithVoid()
{
int value = GetValueFromSomeWhere();
return if value == 3;
DoSomeOtherStuffSinceValueIsNotThree();
}
public int TestMyClassWithInt(int value)
{
return value if value == 3;
DoSomeOtherStuffSinceValueIsNotThree();
return -1;
}
}
любая идея, как я мог это решить? Я начал пробовать с Roslyn.Compilers.CSharp
-namespace, но я не знаю, как начать реализацию.
Ответы
Ответ 1
Если вы можете создать правильный IL для этого, это должно быть работой.
Поскольку это не новая функция CLR, вам не нужно ничего делать с ядром dot net, просто Roslyn.
Для этого у вас есть два варианта:
Один из них - оставить Roslyn как есть и переписать новый синтаксис на соответствующий синтаксис С#, а затем скомпилировать как обычный.
Второй вариант, потому что Roslyn является открытым исходным кодом, заключается в том, чтобы добавить возможность скомпилировать новый синтаксис в свой собственный Roslyn и скомпилировать ваш код с ним.
Ответ 2
Вот альтернативное предложение, которое может работать для тех, кто ищет точки расширения в roslyn. Он может быть даже представлен как пакет nuget! Создайте анализатор и поставщик исправления кода для вашего синтаксиса.
По сути, вы получите красную строку squiggly под любым синтаксисом по вашему выбору, с подсказкой авто-фиксации, которая позволит вам преобразовать его в обычный эквивалент С#.
Он также может использоваться для проверки использования вашей библиотеки, проверки правильности атрибутов в правильных местах, обнаружения общих запахов кода и т.д.
Читайте больше на анализаторах кода на этом посту: https://msdn.microsoft.com/en-us/magazine/dn879356.aspx
Краткое резюме этой ссылки (но отнюдь не замена):
- Установить VS SDK, SDK Roslyn, SDK компилятора.
- Создайте новый проект: Analyzer с шаблоном Code Fix (NuGet + VSIX).
- Будет создано 3 примера создания поставщика анализатора/кода.
- Задайте проект VSIX как проект запуска и запустите