2015-10-13 96 views
0

當我使用下面的方法時,當此列表爲空時,將創建該列表並添加一條記錄,但列表仍然爲空的方法。如何使用ac#擴展方法添加到列表以及創建列表

但是,如果列表已經創建,那麼我看到列表增長超出了方法。

public static void Add(this List<Setting> Settings, object Name, object Value) 
    { 
     if(null==Settings) 
     { 
      Settings = new List<Setting>(); 
     } 

     var item = Settings.FirstOrDefault(s => s.Name.ToLower() == Name.ToString().ToLower()); 
     if (null != item) 
     { 
      //overwrite the value of an existing item 
      item.Value = Value.ToString(); 
     } 
     else 
     { 
      //Add the new Setting to the list 
      Settings.Add(new Setting(Name.ToString(), Value.ToString())); 
     } 
    } 
+0

這對我來說似乎是一種反模式。從https://msdn.microsoft.com/en-us/library/bb383977.aspx開始:「一般來說,我們建議您謹慎實施擴展方法,並且只在必要時才執行。只要有可能,客戶端代碼必須擴展現有類型應該通過創建一個從現有類型派生的新類型來實現。有關更多信息,請參見繼承(C#編程指南)。 – JamieSee

+0

對我而言,真正突出的是它是一個正試圖重新分配自己的對象的擴展方法。如果你的代碼試圖將'this'設置爲別的東西,這不是一件好事。 – moarboilerplate

+1

對於我來說,讓這個方法放在一個空引用上更直觀,因爲將某些東西添加到空白是沒有意義的。 – Setsu

回答

1

擴展方法是不走這裏的路。重新分配對象引用絕不應該是對象本身的責任。這應該是對象的調用者/消費者的責任。

1

這是參數傳遞給C#中方法的方式。 Settings拷貝您稱爲擴展方法的參考。它指向同一個對象,但它是一個不同的參考。所以如果你給它賦一個新值,外部參考保持不變。

您可能會考慮將退貨類型從void更改爲List<Settings>

然後你可以使用:

settings = settings.Add(name, value); 

額外的好處是能夠鏈接Add

settings = settings.Add(name1, value1) 
        .Add(name2, value2) 
        .Add(name3, value3);