如何为函数提供条件参数

本文关键字:条件 参数 函数 | 更新日期: 2023-09-27 18:14:35

我有

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

我想用一个可变参数列表来调用它。我需要做一些像

这样的东西
Foo("yo",a,b,x==42?c);

即如果x是42,则传入a,b,c,否则传入a,b。当然,这种语法是行不通的。我知道我可以将参数编组为List并将列表传递给函数,但是按照代码的组织方式,这样做会非常混乱。有什么语法魔法可以用吗

编辑:让我添加具体的情况

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

如何为函数提供条件参数

你可以直接使用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(...)
);