Как определить метод расширения в скрипте scriptcs csx

Я играю с ScriptCS (это здорово!), Но я не мог понять, как определить метод расширения в файле сценария.csx.

Возьмите этот пример:

using System.IO;

public static class Extensions
{
    public static string Remove(this string source, params string[] toRemove)
    {
        foreach(var r in toRemove)
        {
            source = source.Replace(r,"");
        }
        return source;
    }
}

string[] entries = 
    Directory
        .GetFiles(
            @"C:\Users\blah\blah",
            "*.mp4",
            SearchOption.AllDirectories)
    .Select( p => p.Remove("Users"))
    .ToArray();

foreach(var e in entries)
{
    Console.WriteLine(e);
}

Это приводит к ошибке:

ошибка CS1109: методы расширения должны быть определены в статическом классе верхнего уровня; Расширения - это вложенный класс

Я предполагаю, что ScriptCS оборачивает csx в некоторый класс, который вызывает вложение расширений, есть ли способ обойти это?

3 ответа

Решение

Я чувствую твою боль.

На самом деле это ограничение Roslyn в настоящее время, так как оно объединяет все в класс, даже если это другой класс.

Однако я поговорил с командой Roslyn, и они скоро поддержат методы расширения.

Хорошие новости! Теперь он поддерживается в файлах сценариев C# (.csx)

Но вы должны объявить метод расширения на верхнем уровне:

static string MyToLowerExtension(this string str)
{
    return str.ToLower();
}

Не объявляйте это в статическом классе:

// this will not work!
public static class MyExtensionsClass
{
    static string MyToLowerExtension(this string str)
    {
        return str.ToLower();
    }
}

К сожалению, потому что компиляция чего-то на лету требует класса, scriptcs был разработан, чтобы взять необработанный код, который имел значение, и обернуть его в класс. Вам нужно будет изменить версию scriptcs для ваших потребностей - или рассмотреть возможность участия в проекте.

Впрочем, я тоже люблю scriptcs и думаю, что это один из самых фантастических проектов сегодня!

Я тоже попробовал это рано при использовании scriptcs и мое сердце разбилось, когда это не сработало. Если бы у меня было больше пропускной способности, я бы добавил это дополнение самостоятельно.

AFAIK это не ограничение с Roslyn.

Другие вопросы по тегам