我需要一个方法,该方法接受一个MethodInfo
示例,该示例表示一个带有任意签名的非泛型静态方法,并返回一个绑定到该方法的委托,以后可以使用Delegate.DynamicInvoke
方法调用该委托。
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.
}
}
我希望MethodInfo.CreateDelegate
方法本身能够找出正确的委托类型。很明显,它不能。那么,我如何创建System.Type
的一个示例来表示一个具有与所提供的MethodInfo
示例相匹配的签名的委托呢?
3条答案
按热度按时间rsaldnfx1#
可以使用System.Linq.Expressions.Expression.GetDelegateType方法:
在
!method.IsStatic
的第二次检查中可能有复制粘贴错误--你不应该在那里使用ArgumentNullException
。而且提供一个参数名作为ArgumentException
的参数是一个很好的风格。如果要拒绝所有泛型方法,请使用
method.IsGenericMethod
;如果只想拒绝具有未取代型别参数的泛型方法,请使用method.ContainsGenericParameters
。iq0todco2#
您可能想试试System.LinQ.Expressions
并在以后按如下方式使用
vnjpjtjt3#
如果要创建非静态方法,必须实现目标/示例化对象。