2013-06-05 24 views
12

我在玩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); 
} 

這產生了錯誤:

error CS1109: Extension methods must be defined in a top level static class; Extensions is a nested class

我猜ScriptCS包裹CSX在一些類,這是造成擴展嵌套,沒有任何繞過這個方法?

+1

這是Roslyn的限制。請參閱:http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/7c0a18eb-d37a-40e2-a26c-edb59b8f5cf3/。所以目前你不能在'.csx'文件中定義擴展方法。你需要把它們放在一個dll中,並引用該dll。 – nemesv

+0

@nemesv this look answer-worthy =)謝謝 – TJB

回答

18

我感覺到你的痛苦。

實際上,這是Roslyn目前的限制,因爲它將所有內容都包裝到一個類中,即使它是另一個類。

但是我已經和Roslyn團隊交談過了,他們很快就會支持擴展方法。

+2

3年後遇到這個問題:我們應該如何解釋「即將」這個詞? – fra

+0

這是一個很好的問題。我們即將升級到最新版本的Roslyn(2.0)。我會發現是否增加了對csx中擴展方法的支持。 –

+0

感謝您的更新 – fra

2

不幸的是,由於在飛行中編譯某些東西需要一個類,因此scriptcs被設計爲將重要的原始代碼包裝到一個類中。您需要根據需要修改scriptcs版本 - 或考慮contributing to the project

不過,我也是scriptcs並認爲這是今天最精彩的項目之一!

我也試過這個,當使用scriptcs時,我的心在沒有工作時就崩潰了。如果我有更多的帶寬,我會自己貢獻一下。

AFAIK這不是Roslyn的限制。

+1

這是Roslyn腳本API的限制。 –