2013-05-21 14 views
5

hocome avere params condizionali argomenti a una funzione di

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

voglio chiamare con un elenco di argomenti che possono variare. Devo fare qualcosa come

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

cioè se x è 42 quindi passare in a, b, c altrimenti passare in a, b. Ovviamente quella sintassi non funziona. So che potrei eseguire il marshalling degli argomenti in una lista e passare la lista alla funzione, ma sarebbe molto complicato fare il modo in cui il codice è organizzato. Quindi c'è qualcosa di magico sintassi posso usare

EDIT: mi permetta di aggiungere il caso concreto

var xml = new XDocument(...., 
    new XElement(....), 
    new XElement(....), 
    new XElement(....), 
    x==42? new XElement(.....), 
    new XElement(....), 
    new XElement(....) 
    .... 

risposta

10

Si può semplicemente utilizzare un'istruzione if:

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

non è possibile utilizzare il ?: operatore in questo caso (almeno, al di fuori della chiamata di funzione), perché Foo non ha alcun valore di ritorno. L'operatore ?: deve valutare qualcosa e che qualcosa deve essere assegnato a qualcos'altro.

Un'altra opzione che sarebbe sbarazzarsi della chiamata di funzione duplicato è quello di utilizzare un array o lista per le params:

var parameters = new List<object> { a, b }; 

if (x == 42) 
    parameters.Add(c); 

Foo("yo", parameters); 

E se si voleva davvero per arrivare ?: in là, questo dovrebbe funzionare, anche:

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

per la vostra domanda più specifica sulle chiamate costruttore XDocument/XElement, si potrebbe desiderare di utilizzare Add chiamate piuttosto che una lunga serie di chiamate costruttore. Quindi puoi renderli condizionali. Come è, penso che si dovrebbe anche essere in grado di fare quello che stai chiedendo facendo qualcosa di simile a questo:

XElement elementPrecedingOptionalElement = new XElement(...); 

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

if (x == 42) 
    elementPrecedingOptionalElement.AddAfterSelf(new XElement(...)); 

Utilizzando Add chiamate sarebbe simile a questa:

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

In realtà, un ultimo la versione che è molto più vicina a quello che stai chiedendo sarebbe come questa, che sembra funzionare:

var xml = new XDocument(...., 
    new XElement(...), 
    new XElement(...), 
    new XElement(...), 
    x == 42 
     ? new XElement(...) 
     : null, 
    new XElement(...), 
    new XElement(...) 
); 
+0

+1 per l'opzione 'Elenco <>': è il più vicino a ciò di cui la domanda ha bisogno (anche se è " Sarò "disordinato" come lui sa id). –

+0

vedi la mia modifica per capire perché questo non funziona per me. PS So come farlo funzionare, sto cercando di vedere se riesco a farlo funzionare facilmente e chiaramente - in particolare voglio chiarire l'intento. Non è il mio primo tentativo (che ho subito rinunciato) – pm100

+0

@ pm100 ok risposta aggiornata –

Problemi correlati