You can use the common Action<T> and Func<T> and their variants as delegates, and the bonus is that you donβt need to define a separate delegate at all.
Action<T> accepts up to 16 different type parameters, therefore: Action<T1, T2> and up; Each type parameter is a type parameter for a method in the same position. So Action<int, string> will work for this method:
public void MyMethod(int number, string info)
Func<T> is the same, except for those that return a value. The argument of the last type is the return type. Func<T> not what you would use in your case here.
Example: Func<string, int, object> will be for a method such as:
public object MyOtherMethod(string message, int number)
Using these common delegates makes it clear what arguments for this delegate argument will be, which seems to be your intention.
public void MyMethod(Action<string, MyClass>, string message)
By calling this method, you know that you need to pass a method that uses string and MyClass .
public void MeOtherMethod(Func<int, MyOtherClass>, int iterations)
Here you know that you need to pass a method that takes an int parameter and returns MyOtherClass