2013-07-24 19 views
8
using System; 

class Runner 
{ 
    static void Main() 
    { 
     A a = new A(); 
     // how to say a.PrintStuff() without a 'using' 
     Console.Read(); 
    } 
} 

class A { } 

namespace ExtensionMethod 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 

Come chiamerei il metodo di estensione senza "utilizzare"? E non ExtensionMethod.AExtensions.PrintStuff (a), dal momento che non utilizza il metodo di estensione.Come chiamare un metodo di estensione senza utilizzare

+6

Perché sei contrario all'aggiunta di una dichiarazione using? –

+0

Con il tuo codice così com'è, non puoi. Scusate. Il compilatore C# deve sapere dove trovare il metodo di estensione. Se si trova in uno spazio dei nomi separato, è necessario "usare", in nessun modo attorno ad esso. – rossipedia

+0

Suppongo che potresti essere in grado di chiamare manualmente il metodo di estensione statica e passare l'oggetto come primo argomento, ma difficilmente sarebbe un miglioramento rispetto all'importazione del namespace. – David

risposta

5

Ha bisogno del using per sapere dove vive la funzione. Un esempio di questo in Linq. Senza il System.Linq utilizzando - non sarà abilitato il linq per nessuno dei tuoi

Tuttavia, è possibile definire il metodo di estensione nello stesso spazio dei nomi del chiamante per evitare di inserire un utilizzo. Questo approccio, tuttavia, non funziona se è necessario in molti spazi dei nomi

11

che è possibile se Metodo di estensione e di classe A in stesso spazio dei nomi,

Se è necessario utilizzare diversi spazi dei nomi allora dovete usare using, I don' Penso che ci sia un modo per farlo senza using. Ma si può ridurre il numero di using mettendo tutte le estensioni in uno spazio dei nomi, come per Linq (System.Linq.Extensions)

Nota: È possibile rimuovere lo spazio dei nomi per i metodi di estensione, allora li renderà disponibili a livello globale

+5

+1 per la "nota", ottima idea. –

+2

non sapeva nemmeno che lo spazio dei nomi non era richiesto :) –

3

Questo mi fa sentire sporco, ma puoi mettere i tuoi metodi di estensione nello spazio dei nomi di Sistema. Questo spazio dei nomi è incluso di default nella tua domanda

using System; 

class Runner 
{ 
    static void Main() 
    { 
     A a = new A(); 
     // how to say a.PrintStuff() without a 'using' 
     Console.Read(); 
    } 
} 

class A { } 

namespace System 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 
2

Ruminations sulla creazione di metodi di estensione per un tipo ExtendableType:

  • Nome classe ExtendableTypeExtensions
  • Dichiarare la classe di estensione parziale in modo che i client possano aggiungere metodi di estensione seguendo lo stesso modello; e
  • Mettere i metodi di estensione nello stesso namespace come tipo di base

a meno si dispone di una buona ragione per seguire un modello simile a quello di LINQ:

  • Un sostanziale famiglia di metodi di estensione,
  • Che tutti si applicano a più classi base.
0

Nei nostri progetti le estensioni sono inserite nello stesso spazio dei nomi dell'estensione di classe. Il vostro esempio:

A.cs: 
using System; 
namespace ANamespace 
{ 

    class A { } 
} 

AExtensions.cs: 
namespace ANamespace 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 

Ora, quando si aggiunge using per ANamespace per utilizzando la classe A, sarà incluso anche tutte le estensioni per A classe.

8

E 'possibile chiamare direttamente il proprio interno in questo modo perché è semplicemente un metodo statico, passando l'istanza agirà come primo this parametri:

A a = new A(); 
ExtensionMethod.AExtensions.PrintStuff(a); 

Questo potrebbe essere fonte di confusione per gli altri sviluppatori che capita attraverso questo codice se hai seguito questo modello per i metodi di estensione più comunemente utilizzati. Inoltre, le chiamate di estensione concatenate come LINQ sembrano più simili a un linguaggio funzionale perché annidare ogni chiamata anziché concatenarle.

+0

Questo metodo funziona alla grande quando non si desidera importare uno spazio dei nomi che presenta numerose collisioni con altri spazi dei nomi che sono già stati importati. – humbads

Problemi correlati