2013-06-05 7 views
12

Sto giocando con ScriptCS (che è fantastico!) Ma non sono riuscito a capire come definire un metodo di estensione all'interno di un file di script .csx.Come definire un metodo di estensione in uno script csx script

Prendete questo esempio:

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

Questo produce l'errore:

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

Sto indovinando che ScriptCS avvolge il CSX in qualche classe che sta causando le estensioni per essere nidificati, c'è qualche modo intorno a questo?

+1

Questa è una limitazione in Roslyn. Vedi: http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/7c0a18eb-d37a-40e2-a26c-edb59b8f5cf3/. Quindi attualmente non puoi definire i metodi di estensione nei file '.csx'. È necessario inserirli in una DLL e fare riferimento alla DLL. – nemesv

+0

@nemesv questo sembra answer-worthy =) Grazie – TJB

risposta

18

Sento il tuo dolore.

Attualmente questa è una limitazione di Roslyn attualmente poiché avvolge tutto in una classe anche se è un'altra classe.

Ho parlato con il team di Roslyn tuttavia e presto supportano i metodi di estensione.

+2

Corri in questo numero 3 anni dopo: come dovremmo interpretare la parola "presto"? – fra

+0

Questa è una grande domanda. Stiamo per aggiornare all'ultima versione di Roslyn (2.0). Scoprirò se questo ha aggiunto il supporto per i metodi di estensione all'interno di csx. –

+0

Grazie per l'aggiornamento – fra

2

Sfortunatamente, poiché la compilazione di qualcosa al volo richiede una classe, scriptcs è stata progettata per prendere il codice raw che importa e inserirlo in una classe. Dovresti modificare una versione di scriptcs per le tue esigenze o considerare contributing to the project.

Tuttavia, anche io amorescriptcs e penso che sia uno dei progetti più fantastici là fuori oggi!

Anch'io l'ho provato subito quando uso scriptcs e il mio cuore si è rotto quando non ha funzionato. Se avessi più larghezza di banda, contribuirei a questa aggiunta da solo.

AFAIK questa non è una limitazione con Roslyn.

+1

Si tratta di una limitazione nell'API di scripting di Roslyn. –