I'm playing with ScriptCS (which is awesome!) but I couldn't figure out how to define an extension method within a .csx script file.
Take this example:
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);
}
This yields the error:
error CS1109: Extension methods must be defined in a top level static
class; Extensions is a nested class
I'm guessing that ScriptCS wraps the csx in some class which is causing extensions to be nested, is there any way around this?
I feel your pain.
Actually this is a limitation of Roslyn currently as it wraps everything into a class even if it is another class.
I've talked to the Roslyn team however and they are going to support extension methods soon.
Unfortunately, because compiling something on the fly requires a class, scriptcs
was designed to take the raw code that mattered and wrap it in a class. You would need to modify a version of scriptcs
for your needs -or consider contributing to the project.
However, I too love scriptcs
and think it's one of the most fantastic projects out there today!
I too tried this early on when using scriptcs
and my heart broke when it didn't work. If I had more bandwidth I'd contribute this addition on my own.
AFAIK this is not a limitation with Roslyn.
Good news! It is now supported in C# script files (.csx)
But you have to declare an extension method on top level:
static string MyToLowerExtension(this string str)
{
return str.ToLower();
}
Do not declare it in a static class:
// this will not work!
public static class MyExtensionsClass
{
static string MyToLowerExtension(this string str)
{
return str.ToLower();
}
}