20

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?

4

3 回答 3

21

我感觉到你的痛苦。

实际上,这是目前 Roslyn 的一个限制,因为它将所有内容都包装到一个类中,即使它是另一个类。

不过,我已经与 Roslyn 团队进行了交谈,他们很快就会支持扩展方法。

于 2013-06-09T02:51:52.727 回答
10

好消息!现在在 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();
    }
}
于 2018-10-29T06:15:28.393 回答
2

不幸的是,因为动态编译需要一个类,所以它scriptcs被设计为获取重要的原始代码并将其包装在一个类中。您需要根据需要修改 的版本scriptcs- 或考虑为项目做出贡献

然而,我也很喜欢 scriptcs并认为这是当今最棒的项目之一!

我在使用时也很早就尝试过,scriptcs但当它不起作用时我的心碎了。如果我有更多的带宽,我会自己贡献这个添加。

AFAIK 这不是 Roslyn 的限制。

于 2013-06-05T19:54:43.330 回答