我有
public void Foo(string name, params object[] args)
我想用一个可以变化的arg列表来调用它。我需要做一些像
这样的事情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(....)
....
答案 0 :(得分:10)
你可以使用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(...)
);