问题
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?
回答1:
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.
回答2:
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.
回答3:
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();
}
}
来源:https://stackoverflow.com/questions/16948562/how-to-define-an-extension-method-in-a-scriptcs-csx-script