2013-05-21 23 views
5

如何讓有條件的PARAMS參數的函數

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

我想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(....) 
    .... 

回答

10

您可以只使用一個if語句:

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

您不能使用?: (至少在函數調用之外),因爲Foo沒有返回值。 ?:運營商必須評估一些東西,並且必須將某些東西分配給其他東西。

將擺脫重複的函數調用的另一種選擇是使用的PARAMS一個數組或列表:

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(...) 
); 
+0

+1對於'List <>'選項:它是最接近問題需要(即使它'他會像他一樣「混亂」 ID)。 –

+0

看到我的編輯,看看爲什麼這不適合我。 PS我知道如何使它工作,我想看看我是否可以輕鬆清楚地工作 - 特別是我想明確表達意圖。我不想使用?:,這只是我第一次嘗試(我立即放棄了) – pm100

+0

@ pm100 ok更新回答 –

相關問題