【问题标题】:C# - Using a lambda to specify non-default paramsC# - 使用 lambda 指定非默认参数
【发布时间】:2014-01-25 17:22:32
【问题描述】:

我正在构建一个包含一系列方法的库,每个方法都有几个我试图简化的重载。

许多方法都有重复的重载选项。例如

AddString(string option1)
AddString(string option1, int option2)
AddString(string option1, int option2, bool option3)

AddArray(string option1)
AddArray(string option1, int option2)
AddArray(string option1, int option2, bool option3)

现在,我知道我可以将它们指定为默认参数 - 具有指定默认值的参数。我不想这样做,因为我希望可以在项目之间配置默认值,甚至从调用者到调用者。

我也意识到我可以构建一个具有(可配置)默认值的 Options 对象,并且用户可以像这样将其实例传递给另一个重载

var options = new Options();
options.OptionProperty1 = "A new string";
AddString(options);

但我更喜欢有一个静态 Options 对象,其中包含所有参数的默认值,并且不知何故只指定内联调用中的更改,就像这样

AddString(options => options.Set(
                            OptionProperty1 = "A string",
                            OptionProperty2 = 1,
                            OptionProperty3 = true
                        ));

这可能吗?如果可以,方法签名会是什么样子?

【问题讨论】:

    标签: c# lambda parameter-passing anonymous-function optional-parameters


    【解决方案1】:

    为了拥有像您一样的Set 方法,它必须为您想要设置的每个选项都有一个参数,这可能会在一段时间后变得笨拙,

    您可以选择一个流畅的界面,它应该可以满足您的需求。例如:

    class Options
    {
      Options Option1(string value)
      {
        m_Option1 = value;
        return this;
      }
    
      Options Option2(int value)
      {
        m_Option2 = value;
        return this;
      }
    }
    

    现在AddString 看起来像这样:

    AddString(options = > options.Option1("A String").Option2(1)));
    

    AddString 的实现如下所示:

    public void AddString(Action<Options> optionConfig)
    {
      var options = new Options();
      optionConfig(options);
    
      // rest of method
    }
    

    或者,您可以让调用者创建Options 实例。这将允许他们直接设置属性:

    class Options
    {
      public string Option1{get;set;}
      public int Option2{get;set;}
    }
    

    现在调用者可以说:

    AddString(() = > new Options{Option1="A String", Option2=1});
    

    AddString 看起来像这样:

    public AddString(Func<Options> optionsCreator)
    {
      Options options = optionsCreator();
    
      // rest of method
    }
    

    【讨论】:

    • 我非常喜欢您的建议 - 但是 AddString 方法签名是什么样的?
    • @awj - 我添加了一个例子
    • 我也喜欢这种方法。如果您查看 devexpress 工具,它们采用的方法与此非常相似,并且效果很好。
    • 我不知道为什么,在 AddString 示例实现中,您实例化 Options,然后将其传递给 optionConfig
    • 感谢@Sean 的清晰说明和示例。这是有道理的,虽然我认为我更喜欢第一个例子而不是第二个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2019-12-14
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多