6

我有

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(....)
   ....
4

1 回答 1

11

您可以只使用 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(...)
);
于 2013-05-21T19:00:04.430 回答