如何为函数设置条件参数参数

pm1*_*100 6 c# params

我有

public void Foo(string name, params object[] args)
Run Code Online (Sandbox Code Playgroud)

我想用一个可以变化的args列表来调用它.我需要做点什么

Foo("yo",a,b,x==42?c);
Run Code Online (Sandbox Code Playgroud)

即如果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(....)
   ....
Run Code Online (Sandbox Code Playgroud)

Dav*_*eau 11

你可以使用if语句:

if (x == 42)
   Foo("yo", a, b, c);
else
   Foo("yo", a, b);
Run Code Online (Sandbox Code Playgroud)

?:在这种情况下,您不能使用运算符(至少在函数调用之外),因为Foo没有返回值.该?:运营商必须评估的东西,这东西必须分配给别的东西.

摆脱重复函数调用的另一个选择是使用params的数组或列表:

var parameters = new List<object> { a, b };

if (x == 42)
   parameters.Add(c);

Foo("yo", parameters);
Run Code Online (Sandbox Code Playgroud)

如果你真的想进入?:那里,这也会奏效:

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

有关XDocument/ XElementconstructor调用的更具体问题,您可能希望使用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(...));
Run Code Online (Sandbox Code Playgroud)

使用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"));
Run Code Online (Sandbox Code Playgroud)

实际上,最接近你所要求的版本就是这样,这似乎有效:

var xml = new XDocument(....,
   new XElement(...),
   new XElement(...),
   new XElement(...),
   x == 42
      ? new XElement(...)
      : null,
   new XElement(...),
   new XElement(...)
);
Run Code Online (Sandbox Code Playgroud)