Bạn dường như có 2 mục tiêu mâu thuẫn nhau, và nó đi xuống đến những gì bạn muốn mở rộng phương pháp của bạn để trở:
- Các trường hợp đó gọi là phương pháp mở rộng (bộ sưu tập)
- HOẶC mục đã được thêm vào bộ sưu tập
Từ việc sử dụng ví dụ của bạn, trích dẫn ở đây:
List<int> myInts = new List<int>().AddItem(5);
Bạn làm cho nó trông giống như bạn muốn trả lại bộ sưu tập.Trong mọi trường hợp, chuyển nhượng mà vẫn sẽ không làm việc mà không có một dàn diễn viên, vì phương pháp mở rộng của bạn sẽ cần phải có một kiểu trả về của ICollection, như thế này:
public static ICollection<T> AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return collection;
}
Điều đó sẽ cho phép bạn làm điều này:
List<int> myList = (List<int>) new List<int>().AddItem(5);
Bây giờ nếu bạn muốn trả lại đối tượng đã được thêm, bạn vẫn không nên có loại trả lại là object
. Bạn nên tận dụng lợi thế của tham số kiểu chung chung của bạn, và trở T
, như thế này:
public static T AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return itemToAdd;
}
Tuy nhiên, nếu bạn đang trả lại mục đã được thêm, bạn sẽ không có khả năng chuỗi như thế này:
List<int> myList = (List<int>) new List<int>().AddItem(5);
, vì kiểu trả về của AddItem(5)
là không ICollection, nhưng nó T
(int
, trong trường hợp này). Bạn vẫn có thể chuỗi tuy nhiên, chỉ cần ra khỏi giá trị gia tăng, như thế này:
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
Nó có vẻ như kịch bản đầu tiên là hữu ích hơn (trở về bộ sưu tập), bởi vì nó cho phép bạn chuỗi, ngay lập tức bằng ban đầu câu lệnh gán. Dưới đây là một ví dụ lớn hơn rằng:
List<int> myList = (List<int>) new List<int>().AddItem(1).AddItem(2);
Hoặc, nếu bạn không muốn bỏ, bạn có thể gọi ToList()
trên ICollection mà trở lại:
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();
Cảm ơn. Tôi đã làm điều này lúc đầu, nhưng không thích các đặc điểm kỹ thuật 2 generics. NHƯNG, tôi đã tìm ra rằng vì loại được ngụ ý với TCollection, bạn thực sự không phải chỉ định nó trong mã. –
Phải. Mã để sử dụng nó chính xác là những gì bạn có trong câu hỏi của mình; không cần tham số kiểu rõ ràng. Tôi cũng đã cập nhật câu trả lời liên quan đến jQuery. –