【问题标题】:how to have conditional params arguments to a function如何将条件参数参数传递给函数
【发布时间】:2013-05-16 15:30:25
【问题描述】:

我有

public void Foo(string name, params object[] args)

我想用一个可以变化的参数列表来调用它。我需要做类似的事情

Foo("yo",a,b,x==42?c);

即如果 x 为 42,则传入 a,b,c,否则传入 a,b。当然,这种语法不起作用。我知道我可以将 args 编组到 List 并将列表传递给函数,但是按照代码的组织方式会非常混乱。那么我可以使用一些语法魔法吗

编辑:让我添加具体案例

var xml = new XDocument(....,
   new XElement(....),
   new XElement(....),
   new XElement(....),
   x==42? new XElement(.....),
   new XElement(....),
   new XElement(....)
   ....

【问题讨论】:

    标签: c# params


    【解决方案1】:

    你可以只使用 if 语句:

    if (x == 42)
       Foo("yo", a, b, c);
    else
       Foo("yo", a, b);
    

    在这种情况下,您不能使用?: 运算符(至少在函数调用之外),因为Foo 没有返回值。 ?: 运算符必须对某物进行求值,并且必须将某物分配给其他物。

    另一个消除重复函数调用的方法是使用数组或列表作为参数:

    var parameters = new List<object> { a, b };
    
    if (x == 42)
       parameters.Add(c);
    
    Foo("yo", parameters);
    

    如果您真的想在其中获得?:,这也可以:

    Foo("yo", x == 42 ? new object[] { a, b, c } : new object[] { a, b });
    

    对于有关XDocument/XElement 构造函数调用的更具体问题,您可能希望使用Add 调用而不是一长串构造函数调用。然后你可以让它们有条件。照原样,我认为您也应该能够通过执行以下操作来完成您的要求:

    XElement elementPrecedingOptionalElement = new XElement(...);
    
    var xml = new XDocument(....,
       new XElement(...),
       new XElement(...),
       elementPrecedingOptionalElement,
       new XElement(...),
       new XElement(...)
    );
    
    if (x == 42)
       elementPrecedingOptionalElement.AddAfterSelf(new XElement(...));
    

    使用Add 调用看起来像这样:

    XDocument xml = new XDocument();
    XElement root = new XElement("Root");
    xml.Add(root);
    
    root.Add(new XElement("Item1"));
    root.Add(new XElement("Item2"));
    if (x == 42)
       root.Add(new XElement("Item2.5"));
    root.Add(new XElement("Item3"));
    root.Add(new XElement("Item4"));
    

    实际上,与您要求的更接近的最后一个版本是这样的,这似乎可行:

    var xml = new XDocument(....,
       new XElement(...),
       new XElement(...),
       new XElement(...),
       x == 42
          ? new XElement(...)
          : null,
       new XElement(...),
       new XElement(...)
    );
    

    【讨论】:

    • +1 for List&lt;&gt; 选项:它最接近问题的需要(即使它会像他所说的那样“混乱”)。
    • 查看我的编辑以了解为什么这对我不起作用。 PS我知道如何让它工作,我想看看我是否可以让它轻松而清晰地工作 - 特别是我想明确意图。我不想使用?:,这只是我的第一次尝试(我立即放弃了)
    • @Sahuagin - ty - 你做了我懒得做的事 - 看看如果你传入 null 作为 xelement 会发生什么,我只是假设会发生坏事(tm)。答案是它工作得很好
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2013-01-27
    • 2012-11-26
    • 2021-04-13
    • 2021-04-18
    相关资源
    最近更新 更多