Hoe kun je optionele parameters in C# gebruiken?

Note: Deze vraag werd gesteld in een tijd dat C# nog geen optionele parameters ondersteunde (d.w.z. vóór C# 4).

We'zijn een web API aan het bouwen die'programmatisch gegenereerd wordt vanuit een C# klasse. De klasse heeft methode GetFooBar(int a, int b) en de API heeft een methode GetFooBar die query params neemt zoals &a=foo &b=bar.

De klassen moeten optionele parameters ondersteunen, wat niet wordt ondersteund in de taal C#. Wat is de beste aanpak?

In C#, zou ik normaal meerdere vormen van de methode gebruiken:

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

UPDATE: Dit hierboven vermeld WAS de manier waarop ik standaardwaarden deed met C# 2.0. De projecten waar ik nu aan werk gebruiken C# 4.0 die nu direct optionele parameters ondersteunt. Hier is een voorbeeld dat ik zojuist in mijn eigen code heb gebruikt:

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

Van deze site:

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

C# staat wel het gebruik van het [Optional] attribuut toe (uit VB, maar niet functioneel in C#). Dus je kunt een methode als deze hebben:

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

In onze API wrapper, detecteren we optionele parameters (ParameterInfo p.IsOptional) en stellen een standaard waarde in. Het doel is om parameters als optioneel te markeren zonder toevlucht te nemen tot kludges zoals "optional" in de parameter naam.

Commentaren (4)

Je zou method overloading kunnen gebruiken...

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

Het hangt af van de methode signaturen, het voorbeeld dat ik gaf mist de "int b" alleen methode omdat het dezelfde signatuur zou hebben als de "int a" methode.

Je zou Nullable types kunnen gebruiken...

GetFooBar(int? a, int? b)

Je zou dan kunnen controleren, met a.HasValue, of een parameter is ingesteld.

Een andere optie zou zijn om een 'params' parameter te gebruiken.

GetFooBar(params object[] args)

Als je met named parameters zou willen werken, zou je een type moeten maken om ze te behandelen, hoewel ik denk dat er al zoiets is voor web apps.

Commentaren (0)