You just need to create a type of delegate with the same signature of the method that will be passed into the method accepting the delegate. I wouldn't use the base Delegate type for this, create your own delegate type.
MSDN - How to: Declare, Instantiate, and Use a Delegate (C# Programming Guide)
See this post for information about the Delegate type.
Stack Overflow - Delegate vs delegate
From http://msdn.microsoft.com/en-us/library/system.delegate.aspx:
The Delegate class is the base class for delegate types. However, only the system and compilers can derive explicitly from the Delegate class or from the MulticastDelegate class. It is also not permissible to derive a new type from a delegate type. The Delegate class is not considered a delegate type; it is a class used to derive delegate types.Most languages implement a delegate keyword, and compilers for those languages are able to derive from the MulticastDelegate class; therefore, users should use the delegate keyword provided by the language.
Update
As per your comment I looked into this a bit further. I believe your issue is that you need to convert the method to some form of delegate before passing it such as an Action, Func or anonymous method. I still don't think it is possible to just make a generic method which just accepts all possible inputs and outputs directly from a method. It will need to first be converted into a delegate compatible variable, then the variable will need to be passed. Hopefully, this works for what you need to do.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Display the contents of any method.
Action<string> prntAct = TestMethod;
PrintDelegate(prntAct);
Action<string, string> prntAct2 = TestMethod2;
PrintDelegate(prntAct2);
Console.ReadKey();
}
public static void TestMethod(string xyz)
{
Console.WriteLine("Some random work to do.");
}
public static void TestMethod2(string abc, string def)
{
Console.WriteLine("Some other random work to do.");
}
private static void PrintDelegate(Delegate del)
{
var values = new List<object>();
foreach (var param in del.Method.GetParameters())
{
Console.WriteLine($"{param.Name} : {param.ParameterType}");
if (param.ParameterType == typeof(string))
{
values.Add(param.Name);
}
else
{
values.Add(null);
}
}
}
}