Как определить метод расширения в скрипте 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.