Parece que tiene 2 objetivos en conflicto, y todo se reduce a lo que quiere que sea su método de extensión para volver:
- La instancia que invoca el método de extensión (la colección)
- o el artículo que se añadió a la colección
Desde su uso de ejemplo, citó aquí:
List<int> myInts = new List<int>().AddItem(5);
Hace que parezca que desea devolver la colección.En cualquier caso, que la asignación todavía no funcionará sin una conversión, ya que su método de extensión tendría que tener un tipo de retorno de ICollection, así:
public static ICollection<T> AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return collection;
}
Eso le permitiría hacer esto:
List<int> myList = (List<int>) new List<int>().AddItem(5);
Ahora, si prefiere devolver el objeto que se agregó, todavía no debe tener un tipo de devolución de object
. Usted debe tomar ventaja de su parámetro de tipo genérico, y volver T
, así:
public static T AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return itemToAdd;
}
Sin embargo, si devuelve el elemento que se ha añadido, usted no será capaz de cadena como esta:
List<int> myList = (List<int>) new List<int>().AddItem(5);
, ya que el tipo de retorno de AddItem(5)
es no ICollection, pero es T
(int
, en este caso). Aún se pueden encadenar sin embargo, justo al lado del valor añadido, así:
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
Parece que el primer escenario es más útil (volviendo la colección), ya que le sí permite cadena, justo al lado de la primera sentencia de asignación. Aquí está un ejemplo más de que:
List<int> myList = (List<int>) new List<int>().AddItem(1).AddItem(2);
O, si usted no desea emitir, puede llamar ToList()
en ICollection que regresa:
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();
Gracias. Hice esto al principio, pero no me gustaron las 2 especificaciones genéricas. PERO, descubrí que dado que el tipo está implícito en TCollection, en realidad no es necesario especificarlo en el código. –
Derecha. El código para usarlo es exactamente lo que tenía en su pregunta; no se necesitan parámetros de tipo explícitos. También actualicé la respuesta con respecto a jQuery. –