如何在scriptcs csx脚本中定义扩展方法
我正在使用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包装在一些导致扩展嵌套的类中,有什么方法可以解决这个问题吗?
我感觉到你的痛苦。
实际上这是Roslyn目前的限制,因为它将所有内容都包含在一个类中,即使它是另一个类。
我已经和Roslyn团队谈过了,他们很快就会支持扩展方法。
不幸的是,因为动态编译需要一个类, scriptcs
被设计为采用重要的原始代码并将其包装在一个类中。 您需要根据需要修改scriptcs
版本 – 或者考虑为项目做出贡献 。
但是,我也非常喜欢 scriptcs
并认为它是今天scriptcs
的项目之一!
我在使用scriptcs
时也很早就尝试过,当它不起作用时我心碎了。 如果我有更多的带宽,我会自己贡献这个。
AFAIK这不是Roslyn的限制。
好消息! 它现在受 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(); } }