2011-01-24 20 views
59

È possibile aggiungere un metodo di estensione del costruttore? Voglio aggiungere un elenco < T> costruttore di ricevere quantità specifica di byte su un dato tampone parzialmente riempito (senza il sovraccarico di copiare solo i byte rilevanti e così via):È possibile creare il metodo di estensione del costruttore? Come?

... 
public static List<T>(this List<T> l, T[] a, int n) 
{ 
    for (int i = 0; i < n; i++) 
     l.Add(a[i]); 
} 
... 

così l'utilizzo sarebbe :

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes); 

ho già stato aggiunto un metodo di estensione AddRange:

public static void AddRange<T>(this List<T> l, T[] a, int n) 
{ 
    for (int i = 0; i < n; i++) 
     l.Add(a[i]); 
} 

voglio farlo come un costruttore di troppo. È possibile ? se sì - come?

risposta

42

No, ma se hai cambiato la tua firma AddRange per restituire l'istanza di lista, allora si potrebbe almeno fare

var list = new List<int>().AddRange(array, n); 

che imho è probabilmente più chiaro di sovraccaricare il costruttore in ogni caso.

+0

Grande! Ho perso questa possibilità - è esattamente quello che stavo cercando! – Tar

+0

Ottima alternativa! Ho usato il tuo esempio per aggiungere un metodo Initialize a un oggetto DataColumn. Suppongo. AnEvenBetterConstructor (...) sarebbe stato troppo. –

19

In una parola - no. Dai un'occhiata a this per qualche spiegazione.

Sono stati tagliati dall'elenco delle caratteristiche C# 3, quindi sono stati tagliati dall'elenco delle caratteristiche C# 4 e possiamo solo sperare che possano rendere le funzionalità C# 5, ma non sono molto ottimista.

+36

La vostra mancanza di ottimismo è ragionevole. –

+3

Ma Swift ce l'ha>. < –

27

La risposta di SWeko è fondamentalmente corretta, anche se ovviamente l'articolo a cui si collega riguarda le proprietà di estensioni piuttosto che i costruttori di estensioni.

Abbiamo anche progettato in modo approssimativo i costruttori di estensioni contemporaneamente alle proprietà di estensione; sarebbero un bel zucchero sintattico per il modello di fabbrica. Tuttavia, non hanno mai superato la fase di progettazione; la funzione, anche se carina, non è realmente necessaria e non abilita nuovi fantastici scenari.

Se si dispone di un problema davvero eccezionale che i costruttori di estensioni risolverebbero, sarei lieto di ricevere ulteriori dettagli. Più feedback del mondo reale otteniamo, meglio saremo in grado di valutare i meriti relativi delle centinaia di diversi suggerimenti di funzionalità che riceviamo ogni anno.

+0

Ciao Eric. C'è un esempio qui che ho. Non so se sia buono ma ... Ho ricevuto più di 50 classi da Silverlight 2.0 che devo convertire in WPF 4.0. La classe WriteableBitmap ha un costruttore che è molto diverso. Molto più complesso in WPF, ma in cui è possibile correggere ogni 4 nuovi parametri. Avendo la possibilità di creare (scavalcare) un nuovo costruttore, saremmo in grado di salvarci un sacco di riscrittura del codice. Grazie. –

+0

Sarebbe davvero utile per il costruttore estendere 'string' in modo che possa funzionare con' default (stringa) '. O quello o fornire un costruttore predefinito per 'stringa'. –

+4

Mi rendo conto che sto riportando in vita uno zombie, ma un posto in cui sarebbe molto utile avere estensioni costruttive è per le eccezioni.Vorrei sostituire il parametro message nella maggior parte delle estensioni con un overload che accetta un argomento format e params [], in modo che non sia necessario chiamare esplicitamente string.Format() per creare il messaggio. –

8

So che questo è un urto, solo voluto sottolineare è possibile ereditare la classe List e fare qualcosa del genere:

class List<T> : System.Collections.Generic.List<T> 
    { 
     public List(T[] a, int n) 
      : base() 
     { 
       AddRange(a, n); 
     } 
    } 
Problemi correlati