2012-09-25 14 views
6

Tengo una función que tiene dos argumentos fijos. Pero los siguientes argumentos no son fijos, puede haber dos, tres o cuatro.Cómo pasar los argumentos opcionales

Es un argumento en tiempo de ejecución, entonces, ¿cómo puedo definir esa función?

Mi código es el siguiente:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, dynamic arguments comming it should be 2 or 3) 
     { 

     return null; 
    } 
+0

mayby ​​es esto algo para usted ?: http://csharp.net-tutorials.com/classes/method-overloading/ – Mathlight

Respuesta

12

1) params (C# Reference)

public ObservableCollection<ERCErrors>ErrorCollectionWithValue 
       (string ErrorDode, int MulCopyNo, params object[] args) 
{ 
    //... 
} 

2) Named and Optional Arguments (C# Programming Guide)

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, object arg1 = null, int arg2 = int.MinValue) 
{ 
    //... 
} 

3) Y tal método simple overloading seguiría adaptarse mejor, separar la lógica método para diferentes métodos? Bajo este enlace también se puede encontrar otra descripción de nombrados y opcionales parámetros

5

Un enfoque consiste en haber sobrecargado métodos

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1) 
{ 
    //do some thing with param1 
} 

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1,int param2) 
{ 
    //do some thing with param1 and param3 
} 

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1, int param2, int param3) 
    { 
       //do some thing with param1, param2 and param3 
    } 

entonces todos estos serían válidos

var err = ErrorCollectionWithValue("text", 10, 1); 
var err = ErrorCollectionWithValue("text", 10, 1,2); 
var err = ErrorCollectionWithValue("text", 10, 1,2,3); 

Otro enfoque es utilizar parámetros opcionales . Con esto necesitas solo un método en lugar de los 3 en el primer enfoque.

public ObservableCollection<ERCErrors> ErrorCollectionWithValue 
    (string ErrorDode, int MulCopyNo, int param1 = 0, int param2 = 0, optional int param3 = 0) 
{ 

} 

éstos siguen siendo válidos

var err = ErrorCollectionWithValue("text", 10, 1); //defaults param2 and param3 to 0 
var err = ErrorCollectionWithValue("text", 10, 1,2); //defaults param3 to 0 
var err = ErrorCollectionWithValue("text", 10, 1,2,3); 

Para saltar cualquiera de los parámetros opcionales, es necesario utilizar named parameters y this que sólo se apoya en C# 4.0 y superior

var err = ErrorCollectionWithValue("text", param3: 5); //skipping param1 and param2 

En los otros dos enfoques, no puede omitir el orden de los parámetros.

2

Usted podría ir con params, si el número de argumentos puede variar:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue(string errorCode, int num, params object[] args) 
{ 
    foreach(object obj in args) 
{ 
    //process args. 
} 
} 
+0

Gracias, eso es lo que quiero. –

Cuestiones relacionadas