2009-07-25 12 views
9

Sono abituato ad aggiungere metodi a classi esterne come IEnumerable. Ma possiamo estendere gli array in C#?È possibile estendere gli array in C#?

Sto pianificando di aggiungere un metodo agli array che lo converte in un oggetto IEnumerable anche se è multidimensionale.

non riferibili alla How to extend arrays in C#

+3

Non è più breve da provare che pubblicare una domanda qui? –

+3

Ho provato, ma ho fatto qualcosa di sbagliato nel processo di allora. Ora sto ottenendo il comportamento che mi aspettavo –

risposta

23
static class Extension 
{ 
    public static string Extend(this Array array) 
    { 
     return "Yes, you can"; 
    } 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     int[,,,] multiDimArray = new int[10,10,10,10]; 
     Console.WriteLine(multiDimArray.Extend()); 
    } 
} 
+0

Cosa significa "questo array Array" nel metodo. Penso che Array sia una classe astratta, quindi cosa stai facendo esattamente qui scrivendo "questo array Array"? – VatsalSura

+2

questo array di array significa che * questo array * si riferisce al tipo che deve essere esteso. * questa matrice * potrebbe anche essere * questo T *, dove il metodo sarebbe * vuoto statico pubblico Estendere (questo T obj) *. L'identificatore fornisce semplicemente il tipo un nome, quindi può essere referenziato nel metodo di estensione. – SimonC

2

l'ho fatta!

public static class ArrayExtensions 
{ 
    public static IEnumerable<T> ToEnumerable<T>(this Array target) 
    { 
     foreach (var item in target) 
      yield return (T)item; 
    } 
} 
+0

Cosa significa "questo obiettivo Array" nel metodo. Penso che Array sia una classe astratta, quindi cosa stai facendo esattamente qui scrivendo "questo target Array"? – VatsalSura

23

Sì. Sia attraverso l'estensione della classe Array come già indicato, o estendendo un particolare tipo di matrice o anche un generico array:

public static void Extension(this string[] array) 
{ 
    // Do stuff 
} 

// or: 

public static void Extension<T>(this T[] array) 
{ 
    // Do stuff 
} 

L'ultimo non è esattamente equivalente a estendere Array, poiché non funzionerebbe per un array multidimensionale, quindi è un po 'più limitato, che potrebbe essere utile, suppongo.

+1

+1 La tua implementazione è più sicura del tipo di quella di @ maciejkow. Ho scritto alcuni metodi di estensione dell'array usando un metodo simile qualche tempo fa. –

Problemi correlati