【问题标题】:Conditionally pass optional parameters in C#在 C# 中有条件地传递可选参数
【发布时间】:2018-07-03 17:46:02
【问题描述】:

我有一个带有 10 多个可选参数的函数,并且我的程序中有设置来确定是否应该传递参数。例如,

public void MyFunction(bool? b1=null, bool? b2=null, bool? b3=null.. bool? b10=null)

以下是指示是否应设置参数的设置

bool setb1 = false;
bool setb2 = false;
bool setb3 = true;
bool setb4 = false;
bool setb5 = true;

如果我要按照设置来设置参数,那么我将不得不这样做

if (!setb1 && !setb2 && !setb4)
   MyFunction(b3: value3, b5: value5);

如果我有 10 个设置和 10 个参数,那么我的组合会太多,所以我认为我的实现不可行。实现此目的的正确方法是什么?

【问题讨论】:

  • 10多个可选参数?您最好将方法参数捆绑为结构/类中的属性/字段。所以用户可以设置他想要/需要的任何属性......
  • 删除所有那些丑陋的可选参数并改用一个类,它将包含这些参数作为属性。
  • 使用字典甚至一个简单的数组来代替这个(丑陋的)技术。
  • 如果你不能改变你的方法签名,唯一的办法就是通过反射。如果您可以更改方法签名,请按照其他人的建议使用不同的数据模型。
  • 看来你应该尝试使用command design pattern

标签: c# optional-parameters long-parameter-list


【解决方案1】:

你的函数有一个Long Parameter List

我会传递一个对象作为参数,创建一个类ConditionModle

你可以在这个类中封装你想要的条件。

public class ConditionModle
{
    public bool setb1 { get; set; }
    public bool setb2 { get; set; }
    public bool setb3 { get; set; }
    public bool setb4 { get; set; }
    public bool setb5 { get; set; }
    ....
    public bool Condition1()
    {
        return !this.setb1 && !this.setb2 && !this.setb4;
    }
}

if (model.Condition1())
    MyFunction(model);

这个解决方案可以帮助你的代码

  1. 更清晰,
  2. 新增属性或判断方法不会影响之前的方法。
  3. 添加不会修改调用方法参数的新属性。

【讨论】:

  • 假设所有数据类型都相同 (bool?),您也可以使用 Dictionary<string, bool>。您只需要检查密钥是否存在,然后检查其值。
  • 我不太清楚你的方法如何更容易。用你的方法,我需要很多“Conditional()”函数,不是吗?
  • 在我看来,责任的方法越简单越好。方法的名字是一个动作的意思。虽然有很多方法,但每种方法都有其含义。比看!setb1 && !setb2 && !setb4 更容易理解:)
  • 我明白了。我正在处理的这个函数实际上有超过 60 个参数……我用了 10 个来简化问题。所以如果我要为每个组合构建一个函数,我将有太多的条件函数。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多