Hvordan kan du bruke valgfrie parametere i C#?

Merk: Dette spørsmålet ble stilt på et tidspunkt da C# ennå ikke støttet valgfrie parametere (dvs. før C# 4).

Vi bygger et web-API som genereres programmatisk fra en C#-klasse. Klassen har metoden GetFooBar(int a, int b) og API-et har en metode GetFooBar som tar spørringsparametere som &a=foo &b=bar.

Klassene må støtte valgfrie parametere, noe som ikke støttes i språket C#. Hva er den beste tilnærmingen?

I C# vil jeg normalt bruke flere former for metoden:

void GetFooBar(int a) { int defaultBValue;  GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
 // whatever here
}

OPPDATERING: Dette nevnt ovenfor VAR måten jeg gjorde standardverdier med C# 2.0. Prosjektene jeg jobber med nå bruker C# 4.0 som nå direkte støtter valgfrie parametere. Her er et eksempel jeg nettopp brukte i min egen kode:

public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, 
                                   EDIVanInfo receiver, 
                                   EDIDocumentInfo info,
                                   EDIDocumentType type 
                                     = new EDIDocumentType(EDIDocTypes.X12_814),
                                   bool Production = false)
{
   // My code is here
}
Kommentarer (2)

Fra dette nettstedet:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# tillater bruk av attributtet [Optional] (fra VB, men ikke funksjonelt i C#). Så du kan ha en metode som dette:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

I vår API-innpakning oppdager vi valgfrie parametere (ParameterInfo p.IsOptional) og angir en standardverdi. Målet er å merke parametere som valgfrie uten å ty til kludder som å ha "optional" i parameternavnet.

Kommentarer (4)

Du kan bruke metodeoverbelastning ...

GetFooBar()
GetFooBar(int a)
GetFooBar(int a, int b)

Det avhenger av metoden signaturer, eksempelet jeg ga mangler "int b" eneste metoden fordi det ville ha samme signatur som "int a" metoden.

Du kan bruke Nullable typer ...

GetFooBar(int? a, int? b)

Du kan deretter sjekke, ved hjelp av a.HasValue, for å se om en parameter er angitt.

Et annet alternativ ville være å bruke en 'params' parameter.

GetFooBar(params object[] args)

Hvis du ønsket å gå med navngitte parametere ville måtte opprette en type for å håndtere dem, selv om jeg tror det allerede er noe som dette for web apps.

Kommentarer (0)