如何在scriptcs csx脚本中定义扩展方法

时间:2013-06-05 19:48:26

标签: c# .net extension-methods scriptcs

我正在玩ScriptCS(这太棒了!)但我无法弄明白如何在.csx脚本文件中定义扩展方法

举个例子:

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

这会产生错误:

  

错误CS1109:必须在顶级静态中定义扩展方法   类;扩展是一个嵌套类

我猜测ScriptCS将csx包装在一些导致扩展嵌套的类中,有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:18)

我感到痛苦。

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

我已经和罗斯林团队谈过了,他们很快就会支持扩展方法。

答案 1 :(得分:2)

不幸的是,因为动态编译需要一个类,scriptcs旨在获取重要的原始代码并将其包装在一个类中。您需要根据需要修改scriptcs版本 - 或者考虑contributing to the project

然而,我也 scriptcs并认为它是今天最棒的项目之一!

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

AFAIK这不是对Roslyn的限制。

答案 2 :(得分:1)

好消息!在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();
    }
}