あなたは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);
これで、追加されたオブジェクトを返す場合でも、returnタイプを。にする必要はありません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);
、の戻り型はICollectionでAddItem(5)
はないためT
ですが、 (int
この場合は)です。ただし、次のように、付加価値から離れてチェーンすることはできます。
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
最初の割り当てステートメントからすぐにチェーンできるため、最初のシナリオ(コレクションを返す)の方が便利なようです。その大きな例を次に示します。
List<int> myList = (List<int>) new List<int>().AddItem(1).AddItem(2);
または、キャストしたくない場合は、ToList()
戻ってきたICollectionを呼び出すことができます。
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();