It turned out that the following works very well for me. Although I have not yet confirmed that it handles arg covariance of a general type and all this complexity, I suspect that it is, and I did not need to do anything. :)
internal static bool IsAssignableFrom(Type importingDelegate, Type exportingDelegate)
{
Type importingDelegate, exportingDelegate;
MethodInfo exportingDelegateMethod = exportingDelegate.GetMethod("Invoke");
try
{
exportingDelegateMethod.CreateDelegate(importingDelegate, null);
return true;
}
catch (ArgumentException)
{
return false;
}
}
, Type.GetMethod , Type.GetRuntimeMethod, , . , .
MethodInfo , GetMethod CreateDelegate.