我目前正在编写一些使用MethodInfo.Invoke()
来执行使用反射的方法的代码。如果发生异常,我需要捕获异常,并且不希望edit any Visual Studio exception handling settings这样做。
我已阅读其他StackOverflow文章(Reflection MethodInfo.Invoke() catch exceptions from inside the method和How 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>
(其中ᴺ==参数数量)
答案 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。