仅包含可选参数的方法仅适用于设置参数

时间:2017-07-31 13:15:31

标签: c#

我想编写一个具有可选参数的方法。它应该仅使用给定的那些参数更新某个对象,同时保持其他属性不变。

有问题的部分:

  • Null是所有对象属性的有效值
  • 无法读取对象属性的值以与
  • 进行比较

该方法的签名应该是什么以及该方法的逻辑应该是什么?

所以,让我们说对象看起来像这样:

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;
    }
}

2 个答案:

答案 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");

这将链接函数并编辑这两个属性而不触及任何其他内容。也许这可以帮助你解决问题。