Los Generic Delegate no requieren la definición de una instancia de un delegado para invocar a los métodos.
Existen tres tipos de Generic delegate:
Generic Delegate: Func
El delegado Func define un método que puede ser llamado con argumentos y devolver un valor. Existen varias sobrecargas de este delegado.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Test
{
public static void Main()
{
// Definir el delegado Func con parámetro de entrada de tipo int y devuelve un string
Func<int, string> showIntToString = delegate(int i)
{
return i.ToString();
};
// Definir el delegado Func con parámetro de entrada de tipo string y devuelve un int
Func<string, int> showStringToInt = s =>
{
return int.Parse(s);
};
// Llamar a los delegados
Console.WriteLine(showIntToString(16));
Console.WriteLine(showStringToInt("55"));
}
}
El delegado Action define un método que puede ser llamado con argumentos pero NO devuelve un valor. Existen varias sobrecargas de este delegado.
Un ejemplo básico de este delegado podría ser:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Test
{
public static void Main()
{
// Definir el delegado Action con parámetro de entrada de tipo int
Action<int> showIntToString = delegate(int i)
{
Console.WriteLine("El valor pasado al delegado como parámetro es: {0}", i);
};
// Definir el delegado Action con parámetro de entrada de tipo string
Action<string> showStringToInt = s =>
{
Console.WriteLine("El valor pasado al delegado como parámetro es: {0}", s);
};
// Llamar a los delegados
showIntToString(16);
showStringToInt("55");
}
}
El delegado Predicate define un método que puede ser llamado con argumentos pero SIEMPRE devuelve un valor de tipo bool. Existen varias sobrecargas de este delegado.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Test
{
public static void Main()
{
string validNumber = "28";
string invalidNumber = "28z";
// Definir el delegado Predicate con parámetro de entrada de string
Predicate<string> isValidNumber = d => IsNumber(d);
if (isValidNumber(validNumber))
{
Console.WriteLine("El número {0} es válido", validNumber);
}
else
{
Console.WriteLine("El número {0] NO es válido", validNumber);
}
if (isValidNumber(invalidNumber))
{
Console.WriteLine("El número {0} es válido", invalidNumber);
}
else
{
Console.WriteLine("El número {0} NO es válido", invalidNumber);
}
}
private static bool IsNumber(string number)
{
Decimal d;
return Decimal.TryParse(number, out d);
}
}