590 Stimmen

Wie können Sie optionale Parameter in C# verwenden?

Nota: Diese Frage wurde zu einer Zeit gestellt, als C# noch keine optionalen Parameter unterstützte (d.h. vor C# 4).

Wir erstellen eine Web-API, die programmatisch aus einer C#-Klasse generiert wird. Die Klasse hat die Methode GetFooBar(int a, int b) und die API hat eine Methode GetFooBar mit Abfrageparametern wie &a=foo &b=bar .

Die Klassen müssen optionale Parameter unterstützen, was in der Sprache C# nicht unterstützt wird. Was ist der beste Ansatz?

0voto

Matt Punkte 1

Ich musste dies in einem VB.Net 2.0 Web Service tun. Am Ende gab ich die Parameter als Strings an und konvertierte sie dann in die von mir benötigten Werte. Ein optionaler Parameter wurde mit einer leeren Zeichenkette angegeben. Nicht die sauberste Lösung, aber es hat funktioniert. Achten Sie nur darauf, dass Sie alle Ausnahmen abfangen, die auftreten können.

0voto

Spanky Punkte 4910

Ich habe einen Webdienst zu schreiben, der 7 Parameter benötigt. Jeder ist ein optionales Abfrageattribut für eine SQL-Anweisung, die von diesem Webdienst umschlossen wird. So zwei Workarounds zu nicht-optionale Parameter in den Sinn kommen... beide ziemlich schlecht:

methode1(param1, param2, param 3, param 4, param 5, param 6, param7) Methode 1(Parameter 1, Parameter 2, Parameter 3, Parameter 4, Parameter 5, Parameter 6) Methode 1(param1, param2, param3, param4, param5, param7)... Sie sehen das Bild. Dieser Weg ist der Wahnsinn. Viel zu viele Kombinationen.

Nun zu einer einfacheren Methode, die zwar umständlich aussieht, aber funktionieren sollte: method1(param1, bool useParam1, param2, bool useParam2, usw...)

Das ist ein einziger Methodenaufruf, für den Werte für alle Parameter erforderlich sind, und er wird jeden Fall darin behandeln. Es ist auch klar, wie man es von der Schnittstelle aus verwenden kann.

Es ist ein Hack, aber es wird funktionieren.

0voto

CodeArtist Punkte 5194

Für den Fall, dass jemand einen Rückruf übergeben möchte (oder delegate ) als optionalen Parameter verwendet, kann dies auf diese Weise geschehen.

Optionaler Rückrufparameter:

public static bool IsOnlyOneElement(this IList lst, Action callbackOnTrue = (Action)((null)), Action callbackOnFalse = (Action)((null)))
{
    var isOnlyOne = lst.Count == 1;
    if (isOnlyOne && callbackOnTrue != null) callbackOnTrue();
    if (!isOnlyOne && callbackOnFalse != null) callbackOnFalse();
    return isOnlyOne;
}

0voto

user3555836 Punkte 39

Optionale Parameter sind nichts anderes als Standardparameter! Ich schlage vor, Sie geben beiden Standardparameter. GetFooBar(int a=0, int b=0), wenn Sie keine überladene Methode haben, ergibt a=0, b=0, wenn Sie keine Werte übergeben, wenn Sie 1 Wert übergeben, ergibt sich, übergebener Wert für a, 0 und wenn Sie 2 Werte übergeben, wird der erste a und der zweite b zugewiesen.

Ich hoffe, das beantwortet Ihre Frage.

0voto

Ron K Punkte 11

Ich bin zwar etwas spät dran, aber ich habe nach einer Antwort auf diese Frage gesucht und schließlich eine weitere Möglichkeit gefunden, dies zu tun. Deklarieren Sie die Datentypen für die optionalen Args Ihrer Web-Methode auf den Typ XmlNode. Wenn das optionale Argument weggelassen wird, wird es auf null gesetzt, und wenn es vorhanden ist, können Sie den String-Wert durch den Aufruf von arg.Value erhalten, d.h.,

[WebMethod]
public string Foo(string arg1, XmlNode optarg2)
{
    string arg2 = "";
    if (optarg2 != null)
    {
        arg2 = optarg2.Value;
    }
    ... etc
}

Das Gute an diesem Ansatz ist, dass die von .NET generierte Homepage für die ws immer noch die Argumentliste anzeigt (obwohl die praktischen Texteingabefelder zum Testen verloren gehen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X