title: How to create a delegate from a MethodInfo when method signature cannot be known beforehand?
body: <p>I need a method that takes a <code>MethodInfo</code> instance representing a non-generic static method with arbitrary signature and returns a delegate bound to that method that could later be invoked using <code>Delegate.DynamicInvoke</code> method. My first naïve try looked like this:</p>
  
  <pre><code>using System;
  using System.Reflection;
  
  class Program
  {
      static void Main()
      {
          var method = CreateDelegate(typeof (Console).GetMethod("WriteLine", new[] {typeof (string)}));
          method.DynamicInvoke("Hello world");
      }
  
      static Delegate CreateDelegate(MethodInfo method)
      {
          if (method == null)
          {
              throw new ArgumentNullException("method");
          }
  
          if (!method.IsStatic)
          {
              throw new ArgumentNullException("method", "The provided method is not static.");
          }
  
          if (method.ContainsGenericParameters)
          {
              throw new ArgumentException("The provided method contains unassigned generic type parameters.");
          }
  
          return method.CreateDelegate(typeof(Delegate)); // This does not work: System.ArgumentException: Type must derive from Delegate.
      }
  }
  </code></pre>
  
  <p>I hoped that the <code>MethodInfo.CreateDelegate</code> method could figure out the correct delegate type itself. Well, obviously it cannot. So, how do I create an instance of <code>System.Type</code> representing a delegate with a signature matching the provided <code>MethodInfo</code> instance?</p>