How to define an extension method in a scriptcs cs

2019-02-12 01:04发布

问题:

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();
    }
}