¿Cómo se pueden utilizar los parámetros opcionales en C#?

Nota:** Esta pregunta se formuló en un momento en que C# aún no admitía parámetros opcionales (es decir, antes de C# 4);

Estamos construyendo una API web que se genera mediante programación a partir de una clase de C#. La clase tiene el método GetFooBar(int a, int b) y la API tiene un método GetFooBar que toma parámetros de consulta como &a=foo &b=bar.

Las clases necesitan soportar parámetros opcionales, lo cual no está soportado en el lenguaje C#. ¿Cuál es el mejor enfoque?

En C#, normalmente utilizaría varias formas del método:

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

Actualización: Esto mencionado anteriormente era la forma en que hacía los valores por defecto con C# 2.0. Los proyectos en los que estoy trabajando ahora utilizan C# 4.0 que ahora soporta directamente parámetros opcionales. Aquí hay un ejemplo que acabo de usar en mi propio código:

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

De este sitio:

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

C# permite el uso del atributo [Optional] (desde VB, aunque no es funcional en C#). Así que usted puede tener un método como este:

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

En nuestro wrapper de la API, detectamos los parámetros opcionales (ParameterInfo p.IsOptional) y establecemos un valor por defecto. El objetivo es marcar los parámetros como opcionales sin recurrir a trucos como tener "opcional" en el nombre del parámetro.

Comentarios (4)

Podrías utilizar la sobrecarga de métodos...

pre> GetFooBar() GetFooBar(int a) GetFooBar(int a, int b)

Depende de las firmas de los métodos, en el ejemplo que he dado falta el método "int b" sólo porque tendría la misma firma que el método "int a".

Podrías usar tipos Nullable...

GetFooBar(int? a, int? b)
;

A continuación, podría comprobar, mediante a.HasValue, si se ha establecido un parámetro.

Otra opción sería utilizar un parámetro 'params'.

GetFooBar(params objeto[] args)

Si quieres ir con parámetros con nombre tendrías que crear un tipo para manejarlos, aunque creo que ya hay algo así para las aplicaciones web.

Comentarios (0)