2015-10-13 56 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); 
相关问题