C# 如何对函数使用条件参数参数

C# 如何对函数使用条件参数参数,c#,params,C#,Params,我有 我想用一个可以变化的参数列表来调用它。我需要做一些类似的事情 public void Foo(string name, params object[] args) 也就是说,如果x是42,那么通过a,b,c,否则通过a,b。当然,这种语法不起作用。我知道我可以将参数封送到一个列表中,然后将列表传递给函数,但如果按照代码的组织方式进行,那将非常混乱。那么,我可以使用一些语法魔法吗 编辑:让我添加具体案例 Foo("yo",a,b,x==42?c); 您可以只使用if语句: var xml

我有

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

public void Foo(string name, params object[] args)
也就是说,如果x是42,那么通过a,b,c,否则通过a,b。当然,这种语法不起作用。我知道我可以将参数封送到一个列表中,然后将列表传递给函数,但如果按照代码的组织方式进行,那将非常混乱。那么,我可以使用一些语法魔法吗

编辑:让我添加具体案例

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

您可以只使用if语句:

var xml = new XDocument(....,
   new XElement(....),
   new XElement(....),
   new XElement(....),
   x==42? new XElement(.....),
   new XElement(....),
   new XElement(....)
   ....
在这种情况下不能使用
?:
运算符(至少在函数调用之外),因为
Foo
没有返回值。
?:
运算符必须对某个对象求值,并且该对象必须分配给其他对象

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

if (x == 42)
   Foo("yo", a, b, c);
else
   Foo("yo", a, b);
对于有关
XDocument
/
XElement
构造函数调用的更具体问题,您可能希望使用
Add
调用,而不是一长串构造函数调用。然后你可以让他们有条件。照目前的情况,我认为你也应该能够通过这样做来完成你的要求:

Foo("yo", x == 42 ? new object[] { a, b, c } : new object[] { a, b });
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
调用看起来像这样:

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

var xml = new XDocument(....,
   new XElement(...),
   new XElement(...),
   elementPrecedingOptionalElement,
   new XElement(...),
   new XElement(...)
);

if (x == 42)
   elementPrecedingOptionalElement.AddAfterSelf(new XElement(...));
事实上,最后一个版本更接近于您所要求的版本是这样的,这似乎是可行的:

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"));

+1对于
列表
选项:这是最接近问题所需的内容(即使如他所说的那样“混乱”)。查看我的编辑以了解为什么这对我不起作用。PS我知道如何使它工作,我试图看看我是否可以使它工作轻松和明确-特别是我想明确的意图。我不想使用?:,这只是我的第一次尝试(我立即放弃了)@Sahuagin-ty-你做了我懒得做的事情-看看如果你将null作为一个xelement传递会发生什么,我只是假设坏事情(tm)会发生。答案是它工作得很好