Wydajesz się mieć 2 sprzeczne cele, a wszystko sprowadza się do tego, co chcesz swoją metodę rozszerzenia do powrotu:
- Instancja, która powołuje się na metodę rozszerzenia (kolekcja)
- lub towar który został dodany do kolekcji
ze swojego przykład użycia, cytowany tutaj:
List<int> myInts = new List<int>().AddItem(5);
Wygląda na to, że chcesz zwrócić kolekcję.W każdym razie, że przypisanie nadal nie będzie działać bez obsady, gdyż metoda rozszerzenie musiałaby mieć typ zwracanej kolekcji ICollection, tak:
public static ICollection<T> AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return collection;
}
To pozwoli Ci to zrobić:
List<int> myList = (List<int>) new List<int>().AddItem(5);
Teraz, jeśli wolisz zwrócić obiekt, który został dodany, nadal nie powinieneś mieć typu zwrotu: object
. Należy skorzystać z twojej rodzajowego parametr typu i powrócić T
, tak:
public static T AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return itemToAdd;
}
Jednakże, jeśli jesteś wracać rzecz, która została dodana, nie będzie w stanie łańcuchu:
List<int> myList = (List<int>) new List<int>().AddItem(5);
, gdyż typ powrót AddItem(5)
jest nie ICollection, ale to T
(int
, w tym przypadku). Można nadal przykuwają jednak właśnie od wartości dodanej, takich jak to:
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
Wydaje się pierwszy scenariusz jest bardziej przydatna (powrót kolekcji), ponieważ nie pozwala łańcuch, tuż początkowa instrukcja przypisania. Oto większy przykładem:
List<int> myList = (List<int>) new List<int>().AddItem(1).AddItem(2);
Lub, jeśli nie chcesz rzucić, można nazwać ToList()
w kolekcji ICollection że wraca:
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();
Dzięki. Zrobiłem to na początku, ale nie podoba mi się 2 specyfikacja generyczna. ALE, doszedłem do wniosku, że skoro typ jest domniemany w TCollection, nie musisz go podawać w kodzie. –
Dobrze. Kod, aby go użyć jest dokładnie tym, co masz w swoim pytaniu; nie są wymagane żadne jawne parametry. Zaktualizowałem również odpowiedź dotyczącą jQuery. –