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?
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 ofscriptcs
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:
Do not declare it in a static class:
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.