我想编写一个具有可选参数的方法。它应该仅使用给定的那些参数更新某个对象,同时保持其他属性不变。
有问题的部分:
该方法的签名应该是什么以及该方法的逻辑应该是什么?
所以,让我们说对象看起来像这样:
public class Foo
{
public int Id { get; set; }
public bool? MyBool { get; set; }
public int? MyInt { get; set; }
public string MyString { get; set; }
}
让我们说方法如下:
public void UpdateObject(int id, bool? optBool = null, int? optInt = null,
string optString = null)
{
var objectToUpdate = _fooList.FirstOrDefault(x => x.Id = id);
if(objectToUpdate != null)
{
// Update only set properties?
}
}
现在,我想调用该方法来更新应用程序不同部分的属性,如下所示:
// at some part of app
UpdateObject(1, optInt: 5);
// will set the int property to 5 and leaves other properties unchanged
// at other part of app
UpdateObject(1, optString: "lorem ipsum");
// will set the string property and leaves other properties unchanged
// at other part of app
UpdateObject(1, optBool: null, optString: "lorem ipsum");
// will set the string and bool property and leaves other properties unchanged
请注意,只是设置值不起作用,因为它会用null覆盖不需要的属性。
public void UpdateObject(int id, bool? optBool = null, int? optInt = null,
string optString = null)
{
var objectToUpdate = _fooList.FirstOrDefault(x => x.Id = id);
if(objectToUpdate != null)
{
// This is wrong
objectToUpdate.MyBool = optBool;
objectToUpdate.MyInt = optInt;
objectToUpdate.MyString = optString;
}
}
答案 0 :(得分:3)
而不是传入新值。传入提供新值的Func<T>
。如果Func为null,那么您不做任何事情。如果Func返回null,则只将值设置为null。
public void UpdateObject(Func<int> idProvider, Func<bool?> optBoolProvider = null, Func<int?> optIntProvider = null,
Func<string> optStringProvider = null)
{
if(idProvider != null) Id = idProvider(); // etc.
}
你称之为:
UpdateObject(() => 1234, () => null, optStringProvider: () => "hello world");
另一种选择,如果您可以读取当前值,则为Func<T,T>
,而不是默认为null,您默认为标识,即x - &gt; X。然后你不需要进行空检查(如果必须的话,除非作为合同)
public void UpdateObject(Func<int,int> idProvider, Func<bool?,bool?> optBoolProvider = x => x, Func<int?> optIntProvider = x => x,
Func<string> optStringProvider = x => x)
{
Id = idProvider(Id); // etc.
}
我最近一直在java的土地上,如果语法关闭,请道歉。
答案 1 :(得分:0)
您可以重载这些功能,为您提供有关添加哪些变量以及保持相同变量的选项。
这样您就可以选择仅更改要更改的给定对象的值。
您还可以执行以下操作:
public Foo changeString(Foo f, string s)
{
f.myString = s;
return f;
}
public Foo changeInt(Foo f, int i)
{
f.myInt = i;
return f;
}
//external piece of code
Foo f = new Foo ();
f = changeInt(f, 5).changeString(f, "abc");
这将链接函数并编辑这两个属性而不触及任何其他内容。也许这可以帮助你解决问题。