如何使用 c# 扩展方法添加到列表以及创建列表
How to use a c# extension method to add to list as well as create the list
当我使用下面的方法时,当这个列表为空时,创建了列表并添加了一条记录,但是在方法之外列表仍然为空。
但是,如果列表已经创建,那么我会看到列表在方法之外增长。
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()));
}
}
这是在 C# 中将参数传递给方法的方式。 Settings
是您调用扩展方法的引用的 copy。它指向同一个对象,但它是不同的引用。所以如果你给它赋一个新值,外部引用保持不变。
您可以考虑将 return 类型从 void
更改为 List<Settings>
。
那么你可以使用:
settings = settings.Add(name, value);
额外的好处是能够链接 Add
:
settings = settings.Add(name1, value1)
.Add(name2, value2)
.Add(name3, value3);
扩展方法不是解决此问题的方法。重新分配对象引用永远不应该是对象本身的责任。那应该是对象的caller/consumer的责任。
当我使用下面的方法时,当这个列表为空时,创建了列表并添加了一条记录,但是在方法之外列表仍然为空。
但是,如果列表已经创建,那么我会看到列表在方法之外增长。
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()));
}
}
这是在 C# 中将参数传递给方法的方式。 Settings
是您调用扩展方法的引用的 copy。它指向同一个对象,但它是不同的引用。所以如果你给它赋一个新值,外部引用保持不变。
您可以考虑将 return 类型从 void
更改为 List<Settings>
。
那么你可以使用:
settings = settings.Add(name, value);
额外的好处是能够链接 Add
:
settings = settings.Add(name1, value1)
.Add(name2, value2)
.Add(name3, value3);
扩展方法不是解决此问题的方法。重新分配对象引用永远不应该是对象本身的责任。那应该是对象的caller/consumer的责任。