2013-05-21 30 views
5

mamjak mieć warunkowe params argumenty do funkcji

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

Chcę wywołać ją z listy args, które mogą się różnić. Muszę zrobić coś takiego, jak

tzn. Jeśli x jest 42, to należy przekazać a, b, c inaczej przekazać a, b. Oczywiście ta składnia nie działa. Wiem, że mógłbym sprowadzić argumenty do listy i przekazać listę do funkcji, ale byłoby to bardzo kłopotliwe w sposobie organizowania kodu. Więc jest jakiś magiczny składnia mogę używać

EDIT: Dodam konkretny przypadek

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

Odpowiedz

10

można po prostu użyć instrukcji if:

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

Nie można używać ?: operator w tym przypadku (przynajmniej poza wywołaniem funkcji), ponieważ Foo nie ma wartości zwracanej. Operator ?: musi ocenić coś, a to coś musi być przypisane do czegoś innego.

Innym rozwiązaniem, które pozbyć duplikatu wywołania funkcji jest użycie tablicy lub listy dla params:

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

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

Foo("yo", parameters); 

A jeśli naprawdę chciał dostać ?: tam, to będzie działać również:

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

dla bardziej konkretne pytanie o XDocument/XElement wywołań konstruktorów, może chcesz używać Add połączenia zamiast jednego długą serię rozmów konstruktora. Następnie możesz je uzależnić. Jak to jest, myślę, że powinien również być w stanie robić to, co pytasz robiąc coś takiego:

XElement elementPrecedingOptionalElement = new XElement(...); 

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

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

Korzystanie Add połączeń będzie wyglądać mniej więcej tak:

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

Faktycznie, jeden ostatni Wersja, która jest znacznie bliższa temu, o co prosisz, byłaby podobna do tej, która wydaje się działać:

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

+1 dla opcji 'Lista <>': jest najbliżej tego, czego potrzebuje pytanie (nawet jeśli " Będzie "niechlujny" jak on ID). –

+0

zobacz moją edycję, aby zobaczyć, dlaczego to nie działa dla mnie. PS Wiem, jak to działa, staram się sprawdzić, czy mogę sprawić, by działało to łatwo i wyraźnie - w szczególności chcę jasno wyrazić zamiar. Nie używam tego?:, To była moja pierwsza próba (od razu się poddałem) – pm100

+0

@ pm100 ok zaktualizowana odpowiedź –

Powiązane problemy