Herhangi bir yazdığımız metot parametre olarak başka metodu göndermek için Action ve Func delegelerini kullanacağız. İkiside aynı işi yapıyor. Aralarında fark ise Func geriye değer döndürüyor, Actionise döndürmüyor. Daha da açıklamak gerekirse Action prosedür, Func fonksiyon olarak tanımlanabilir. İlk olarak Action ile ilgili aşağıdaki örneği inceleyelim.

//mesaj gösteren metodumuz
private void MesajGöster()
{
    MessageBox.Show("Sinan AKYAZICI");
}
//İstediğimiz metodumuz çalıştıracağımız metod
private void Çalıştır(Action method)
{
    method.Invoke();
}
private void button1_Click(object sender, EventArgs e)
{
    Çalıştır(MesajGöster);
}

Yukardaki örnekte Çalıştır metodunda parametre olarak Action tipinde parametre tanımladık. Sonra Çalıştır metodumuzu istediğimiz metodu gönderebiliriz. Yukardaki örnekte MesajGöster metodunu göndererek bu metodu Çalıştır metodunun içinde Invoke() metodu ile çalıştırdık. Eğer MesajGöster metodumuz parametre alacak olsaydı aşağıdaki gib bir örnek ile işlemi gerçekleştirecektik.

//Object olarak gelen değişkeni içeride string e dönüştürüyoruz.
private void MesajGöster(object mesaj)
{
    MessageBox.Show(mesaj.ToString());
}
//Action tanımlarken <> işarekleri arasında gelecek metodun parametre tiplerini
//belirtiyoruz. Aralarına virgül koyarak birden fazla parametre tanımlayabiliriz.
//Buradaki dikkat edilecek nokta buraya gelecek metod ile <> arasına yazacağımız parametre tipleri ve
//sayıları aynı olmak zorunda.
//Ben her türlü tipi gönderebileyim diye object olarak tanımladım.
private void Çalıştır(Action<object> method)
{
    method.Invoke(61); //int gönderdik
    method.Invoke("Sinan AKYAZICI"); //string gönderdik
}
private void button1_Click(object sender, EventArgs e)
{
    //metodu bu şekilde çağırıyoruz.
    Çalıştır(MesajGöster);
}

Metodumuz geriye değer döndürmüyorsa yukarıdaki örnek ile işimizi görebiliriz. Şimdi ise geriye değer döndüren bir metod ile örnek yapalım.

private string MesajGetir()
{
    return "Sinan AKYAZICI";
}
//Göndereceğimiz methodumuz geriye string tipinde değer döndürdüğü için
//<> arasında string olarak geriye dönen değerimizi belirttik.
private string Çalıştır(Func<string> method)
{
    return method.Invoke();
}
private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(Çalıştır(MesajGetir));
}

Eğer MesajGetir metodumuz parametre alacak olsaydı aşağıdaki örnekte gibi işlemimizi gerçekleştireceğiz.

//Object olarak gelen değişkeni içeride string e dönüştürüyoruz.
private string MesajGetir(object mesaj)
{
    return mesaj.ToString();
}
//<> arasında yazdığımız sonra tip her zaman geriye dönen değeri belirtir.
//Oyüzden burada ilk değer gelen metodumuzdaki değer son değer ile geriye
//dönen değer
private string Çalıştır(Func<object,string> method)
{
    return method.Invoke(61)+" "+method.Invoke("Sinan AKYAZICI"); //int ve string gönderdik.
}
private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(Çalıştır(MesajGetir));
}

Bu şekilde metoda parametre olarak metod gönderebiliyoruz.