Ako môžete v jazyku C# používať voliteľné parametre?

Poznámka: Táto otázka bola položená v čase, keď jazyk C# ešte nepodporoval voliteľné parametre (t. j. pred C# 4).

Vytvárame webové API, ktoré'je programovo generované z triedy jazyka C#. Trieda má metódu GetFooBar(int a, int b) a API má metódu GetFooBar prijímajúcu parametre dotazu typu &a=foo &b=bar.

Triedy musia podporovať voliteľné parametre, čo jazyk C# nepodporuje. Aký je najlepší prístup?

V jazyku C# by som normálne použil viacero foriem metódy:

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

DOPLNENIE: Uvedené bolo spôsob, akým som v jazyku C# 2.0 robil predvolené hodnoty. Projekty, na ktorých teraz pracujem, používajú jazyk C# 4.0, ktorý teraz priamo podporuje voliteľné parametre. Tu je príklad, ktorý som práve použil vo svojom vlastnom kóde:

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

Z tejto stránky:

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

Jazyk C# umožňuje používať atribút [Optional] (z VB, hoci v C# nie je funkčný). Takže môžete mať takúto metódu:

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

V našom API wrapperi zisťujeme voliteľné parametre (ParameterInfo p.IsOptional) a nastavujeme predvolenú hodnotu. Cieľom je označiť parametre ako voliteľné bez toho, aby sme sa uchyľovali k takým kľučkám, ako je "optional" v názve parametra.

Komentáre (4)

Môžete použiť preťaženie metód...

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

Závisí to od signatúr metód, v príklade, ktorý som uviedol, chýba len metóda "int b", pretože by mala rovnakú signatúru ako metóda "int a".

Mohli by ste použiť typy Nullable...

GetFooBar(int? a, int? b)

Potom by ste mohli pomocou a.HasValue skontrolovať, či bol parameter nastavený.

Ďalšou možnosťou by bolo použiť parameter 'params'.

GetFooBar(params object[] args)

Ak by ste chceli použiť pomenované parametre, museli by ste vytvoriť typ na ich spracovanie, hoci si myslím, že niečo také už existuje pre webové aplikácie.

Komentáre (0)