2011-01-24 12 views
59

¿Es posible agregar un método de extensión de constructor? Quiero añadir una lista < T> constructor para recibir la cantidad específica de bytes de un buffer parcialmente lleno dado (sin el añadido del copiando sólo los bytes correspondientes y así sucesivamente):¿Es posible crear constructor-extension-method? ¿cómo?

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

por lo que el empleo sea :

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

que ya ha añadido un método de extensión 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]); 
} 

quiero hacerlo como un constructor también. Es posible ? si es así, ¿cómo?

Respuesta

42

No, pero si ha cambiado su firma AddRange para devolver la instancia de la lista, a continuación, al menos podría hacer

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

la que en mi humilde opinión es probablemente más claro que la sobrecarga del constructor de todos modos.

+0

¡Estupendo! Perdí esa posibilidad, ¡eso es exactamente lo que estaba buscando! – Tar

+0

¡Gran alternativa! Usé su ejemplo para agregar un método Initialize a un objeto DataColumn. Supongo que. AnEvenBetterConstructor (...) habría sido demasiado. –

19

En una palabra - no. Eche un vistazo a this para alguna explicación.

Se cortaron de la lista de características C# 3, luego se cortaron de la lista de características C# 4, y solo podemos esperar que puedan hacer las características C# 5, pero no soy muy optimista.

+36

Su falta de optimismo es razonable. –

+3

Pero Swift lo tiene>. < –

27

La respuesta de SWeko es básicamente correcta, aunque, por supuesto, el artículo al que se vincula es sobre propiedades de extensión en lugar de constructores de extensión.

También hicimos un diseño aproximado para los constructores de extensiones al mismo tiempo que lo hacíamos con las propiedades de extensión; serían un buen azúcar sintáctico para el patrón de fábrica. Sin embargo, nunca pasaron de la etapa de diseño; la función, aunque es agradable, no es realmente necesaria y no permite nuevos escenarios asombrosos.

Si tiene un problema realmente increíble que los desarrolladores de la extensión resolverían, me complacería escuchar más detalles. Cuantos más comentarios sobre el mundo real recibamos, mejor podremos evaluar los méritos relativos de los cientos de diferentes sugerencias de funciones que obtenemos todos los años.

+0

Hola Eric. Aquí hay un ejemplo que tengo. No sé si es bueno pero ... obtuve más de 50 clases de Silverlight 2.0 que tengo que convertir a WPF 4.0. La clase WriteableBitmap tiene un constructor que es realmente diferente. Mucho más complejo en WPF pero donde podríamos arreglar cada 4 nuevos parámetros. Al tener la posibilidad de crear (anular) un nuevo constructor, podremos guardar un gran número de códigos reescritos. Gracias. –

+0

Sería realmente útil para el constructor extender 'cadena' para que pueda funcionar con' default (string) '. O eso o proporcionar un constructor predeterminado para 'cadena'. –

+4

Me doy cuenta de que estoy devolviendo la vida a un zombie, pero un lugar donde sería muy útil tener extensiones de construcciones es para excepciones.Me gustaría reemplazar el parámetro de mensaje en la mayoría de las extensiones con una sobrecarga que toma un formato y params object [] argumentos, por lo que no es necesario llamar explícitamente a string.Format() para crear el mensaje. –

8

Sé que esto es un bache, sólo quería señalar que se puede heredar la clase List y hacer algo como esto:

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