你似乎有2倍相互衝突的目標,並把它歸結爲您希望您的擴展方法返回什麼:
從你的使用例子,在這裏引用:
List<int> myInts = new List<int>().AddItem(5);
你讓它看起來像你想要返回集合。在任何情況下,分配仍然不會沒有科協工作,因爲你的擴展方法需要有ICollection的返回類型,就像這樣:
public static ICollection<T> AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return collection;
}
這將允許你這樣做:
List<int> myList = (List<int>) new List<int>().AddItem(5);
現在,如果您希望返回添加的對象,那麼您仍不應該有返回類型object
。你應該充分利用你的泛型類型參數,並返回T
,像這樣:
public static T AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return itemToAdd;
}
但是,如果你回國加入該項目,你將不能夠像這條產業鏈:
List<int> myList = (List<int>) new List<int>().AddItem(5);
,因爲AddItem(5)
返回類型不 ICollection的,但它是T
(int
,在這種情況下)。您仍然可以連鎖不過,就在增值的,就像這樣:
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
這似乎是第一個場景是比較有用的(返回集合),因爲它允許您鏈,馬上最初的賦值語句。這裏有一個更大的示例:
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();
謝謝。起初,我這樣做,但不喜歡2泛型規範。但是,我想到了,因爲類型是TCollection隱含的,你實際上不需要在代碼中指定它。 – 2010-07-09 20:12:17
對。使用它的代碼正是你在你的問題中所擁有的;沒有明確的類型參數是必要的。我也更新了關於jQuery的答案。 – 2010-07-09 20:20:44