2011-04-27 17 views
6

He estado usando la forma en que declaro delegado en el nivel de clase:cómo escribir un método con un parámetro de delegado en C#/.NET 4.0?

protected delegate void FieldsDelegate(); 

//and then write a method e.g. 

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, FieldsDelegate fieldsDelegate) 

Sin embargo, esto es muy engorroso y no puedo ver al instante lo que el delegado es como. Entonces me gustaría hacerlo así:

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, delegate void fieldsDelegate()) 

por lo que no tengo la definición por separado.

Lo anterior no está permitido por algún motivo. Entonces, ¿cómo puedo hacerlo?

+0

En realidad el sufijo '' Delegate' en FieldsDelegate' es un indicador muy bueno ya. –

Respuesta

12

.NET ahora proporciona los genéricos Action y Func para este propósito.

En su caso, este delegado no toma ningún parámetro y no devuelve nada.

// protected delegate void FieldsDelegate(); // Don't need this anymore 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Action fieldsDelegate 
          ) 

Si se tomó una cadena como parámetro:

// protected delegate void FieldsDelegate(string s); 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Action<string> fieldsDelegate 
          ) 

Si se tomó una cadena como parámetro y devuelve un bool:

// protected delegate bool FieldsDelegate(string s); 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Func<string, bool> fieldsDelegate 
          ) 
+0

reversión si no está de acuerdo –

+0

@Henk - Estoy de acuerdo. Es más fácil de entender si incluyo el delegado que reemplazó. –

5

podría utilizar el genérico Action<T> y Func<T> y sus variantes como delegados, y la ventaja es que ni siquiera necesita definir un delegado por separado.

Action<T> toma hasta 16 parámetros de tipo diferentes, entonces: Action<T1, T2> y en adelante; Cada parámetro de tipo es el parámetro de tipo para el método en la misma posición. Así, Action<int, string> funcionaría para este método:

public void MyMethod(int number, string info) 

Func<T> es el mismo, excepto que es para los métodos que devuelven un valor. El último argumento de tipo es el tipo de retorno. Func<T> no es lo que usaría en su caso aquí.

Ejemplo: Func<string, int, object> sería para un procedimiento tal como:

public object MyOtherMethod(string message, int number) 

El uso de estos delegados genéricos deja claro cuáles serían los argumentos a favor de este argumento delegado, lo que parece ser su intención.

public void MyMethod(Action<string, MyClass>, string message) 

Calling ese método, usted sabe que necesita para pasar un método en el que se toma una string y una MyClass.

public void MeOtherMethod(Func<int, MyOtherClass>, int iterations) 

Aquí, usted sabe que necesita para pasar un método que toma un parámetro int, y devuelve MyOtherClass

Cuestiones relacionadas