Un delegado es un placeholder para un método. Permite pasar una función como parámetro a un método.
Hay varios tipos de delegado:
Action<T>
consume una clase, devuelve void
Ejemplo Console.WriteLine();
Predicate<T>
consume una clase, devuelve bool
Por ejemplo para abstraer condiciones
Func<T, K>
consume una clase y devuelve otra. Por ejemplo para abstraer mappings
Usaremos el struct Book
para todos los ejemplos
public struct Book
{
public string Title; // Title of the book.
public string Author; // Author of the book.
public decimal Price; // Price of the book.
public bool Paperback; // Is it paperback?
public Book(string title, string author, decimal price, bool paperBack)
{
Title = title;
Author = author;
Price = price;
Paperback = paperBack;
}
}
Action (Consumer)
Tenemos el ejemplo BookDBActionService
public class BookDBActionService
{
// List of all books in the database
List<Book> list = new List<Book>();
// initialize test data on constructor
public BookDBActionService()
{
list.Add(new Book("title1", "author1", 10, true));
list.Add(new Book("title2", "author2", 20, false));
}
// Aqui tenemos el Action<Book> donde delegamos como se procesa cada libro
public void ProcessPaperbackBooks(Action<Book> processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
{
// delegate call
processBook(b);
}
}
}
}
Llamada donde ejecutamos el código y llamamos al Action<Book>
public static void Main(string[] args)
{
var bookDBAction = new BookDBActionService();
bookDBAction.ProcessPaperbackBooks(book => Console.WriteLine(book.Title));
}
Read More