Before you continue reading this article, you must be familiar with the basics of delegates in C#. If you do not understand delegates then I highly recommend reading this previous article on Delegates.
In the preceding article and code sample, we have a delegate called DelegateInt that takes two integer parameters and returns an int type.
- public delegate int DelegateInt(int a, int b);
The DelegateInt works only with methods that have two integer parameters. What if we want to create a delegate that will work with any type of two parameters and return any type? In that case, it will not work. This is where generics are useful and generics play a major role in LINQ.
The following code snippet declares a generic delegate.
- public delegate string GenericDelegateNumber<T1, T2>(T1 a, T2 b);
The following code snippet defines two methods for creating instances of generic delegates.
- public static string AddDoubles(double a, double b)
- {
- return (a + b).ToString();
- }
-
- public static string AddInt(int a, int b)
- {
- return (a + b).ToString();
- }
The following code snippet creates two delegate instances where the first one uses integers and the second delegate uses double parameter values.
- GenericDelegateNumber<int, int> gdInt = new GenericDelegateNumber<int, int>(AddInt);
- Console.WriteLine(gdInt(3, 6));
- GenericDelegateNumber<double, double> gdDouble = new GenericDelegateNumber<double, double>(AddDoubles);
- Console.WriteLine(gdDouble(3.2, 6.9));
The following code lists the complete sample.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace GenericDelegateSample
- {
- class Program
- {
- static void Main(string[] args)
- {
- GenericDelegateNumber<int, int> gdInt = new GenericDelegateNumber<int, int>(AddInt);
- Console.WriteLine(gdInt(3, 6));
- GenericDelegateNumber<double, double> gdDouble = new GenericDelegateNumber<double, double>(AddDoubles);
- Console.WriteLine(gdDouble(3.2, 6.9));
- Console.ReadKey();
- }
-
-
- public delegate string GenericDelegateNumber<T1, T2>(T1 a, T2 b);
-
- public static string AddDoubles(double a, double b)
- {
- return (a + b).ToString();
- }
-
- public static string AddInt(int a, int b)
- {
- return (a + b).ToString();
- }
- }
-
- }