2017-07-28 52 views
1

nullの可能性のあるリストに対して拡張メソッドを使用できますか?その場合は、Extensionメソッドの内部でインスタンス化しますか?内部インスタンス化を使用したnullリストの拡張メソッド

リストをインスタンス化するそれに適用される拡張メソッドの内側には、あなたがforeachループで反復しているリストからアイテムを追加または削除しようとしたときのように聞こえます。

public static void AddOrUpdate(this List<blabla> i, Person p) 
{ 
i = i ?? new List<blabla>(); //Is it OK no instantiate inside? 
i.RemoveAll(t => t.Id == p.Id && t.Role == RoleEnum.Admin); 
i.Add(p); //Since it is a reference type, I dont need to return it (even "this" parameter) right? 
} 

そして、このようにそれを使用します。

//List<blabla> TeamWork comes from anywhere else, instantiated or not 
TeamWork.AddOrUpdate(aPersonA); 
TeamWork.AddOrUpdate(aPersonB); 
DoSomething(Teamwork); 
+0

を。私のように、あなたはそれをしてはいけません。類似のタイプの他のリストのための混乱を作成します。あなたの要件を満たすラッパークラスを使う方がよいでしょう。 – Ramankingdom

答えて

3

をいいえ、それはパラメータがrefとして渡す必要があり、あなたがthisキーワードと組み合わせrefを使用することができないため、動作しません。

しかし、あなたは、常にこのlikle何か行うことができます。彼らはあなたがすることはできませんGUSMANによって説明プログラミングタスクの.asを緩和どこそれが拡張メソッドを作成して使用しても大丈夫だ

public static List<blabla> AddOrUpdate(this List<blabla> i, Person p) 
{ 
    i = i ?? new List<blabla>(); 
    i.RemoveAll(t => t.Id == p.Id && t.Role == RoleEnum.Admin); 
    i.Add(p); 
    return i; 
} 

TeamWork = TeamWork.AddOrUpdate(aPersonA); 
TeamWork = TeamWork.AddOrUpdate(aPersonB); 
DoSomething(Teamwork); 
+0

これで問題はありません。しかし、新しいリストの一部はどうですか?(); extesionメソッドの中に? –

+1

@FernandoTorres何が問題なのですか?リストを返して元の変数に再び割り当てます。古いインスタンスの場合は同じままです。新しいインスタンスの場合は、参照が更新されるため、変数を再割り当てする必要があります。 – Gusman

+0

リストをインスタンス化するそれに適用される拡張メソッドの中に...あなたがあなたのリストをforeachループで反復しているリストから項目を追加または削除しようとすると、音が似ています。しかし、あなたは正しいです、それはちょうど「サンドライク」問題です:P –

関連する問題