如何从MethodInfo创建Action <tᴺ>或Func <tᴺ,out =“”tresult =“”> </tᴺ,> </tᴺ>

时间:2014-12-11 09:14:09

标签: c# .net reflection functional-programming

我目前正在编写一些使用MethodInfo.Invoke()来执行使用反射的方法的代码。如果发生异常,我需要捕获异常,并且不希望edit any Visual Studio exception handling settings这样做。

我已阅读其他StackOverflow文章(Reflection MethodInfo.Invoke() catch exceptions from inside the methodHow can I create an Action delegate from MethodInfo?),这些文章说明了通过创建委托解包调用并执行该调用而不是调用Invoke()的能力。

我遇到的问题是我不知道我正在调用的方法的方法签名;它可以有一个返回类型,或返回void,它可能有几个参数,或者没有。

请考虑以下代码:

public void Run(object instance, MethodInfo method)
{
    object[] parameters = CreateParameters(method);
    object result = default(object);
    try
    {
        result = method.Invoke(context, parameters);
    }
    catch(Exception ex)
    {
        // Never happens because VS does not catch exceptions thrown by Invoke();
    }
}

鉴于这种情况,我一直坚持如何创建合适的Action<Tᴺ>Func<Tᴺ, out TResult> (其中ᴺ==参数数量)

1 个答案:

答案 0 :(得分:2)

创建一个动态方法来完成工作并从动态方法创建委托。

例如,想象一个方法

static public int Add(int a, int b)
{
    return a+b;
}

使用DynamicMethod发出方法:

static public object Add(object[] parameters)
{
    return Add((int)parameters[0], (int)parameters[1]);
}

并创建委托给发射的方法。

var myDelegate = MyDynamicMethod.CreateDelegate(typeof(Func<object[], object>)) as Func<object[], object>:

您必须使用反射来了解签名才能发出足够的DynamicMethod。