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)会发生。答案是它工作得很好