C# 如何创造行动<;Tᴺ&燃气轮机;或Func<;Tᴺ;,out TResult>;来自MethodInfo
我目前正在编写一些代码,它使用C# 如何创造行动<;Tᴺ&燃气轮机;或Func<;Tᴺ;,out TResult>;来自MethodInfo,c#,.net,reflection,functional-programming,C#,.net,Reflection,Functional Programming,我目前正在编写一些代码,它使用MethodInfo.Invoke()执行一个使用反射的方法。如果发生异常,我需要捕获异常,但我不想这样做 我已经阅读了其他StackOverflow文章(和),它们演示了通过创建委托并执行该委托而不是调用Invoke()来展开调用的能力 我的问题是我不知道我调用的方法的方法签名;它可以有一个返回类型,或者返回void,也可以有多个参数,或者没有参数 考虑以下代码: public void Run(object instance, MethodInfo method
MethodInfo.Invoke()
执行一个使用反射的方法。如果发生异常,我需要捕获异常,但我不想这样做
我已经阅读了其他StackOverflow文章(和),它们演示了通过创建委托并执行该委托而不是调用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();
}
}
在这种情况下,我一直在思考如何创建适当的
操作
或Func
(其中ᴺ == 参数数量)创建一个执行作业的动态方法,并从动态方法创建一个委托
例如,想象一个方法
static public int Add(int a, int b)
{
return a+b;
}
使用DynamicMethod的emit方法执行以下操作:
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>:
var myDelegate=MyDynamicMethod.CreateDelegate(typeof(Func))作为Func:
您必须使用反射来了解签名,才能发出adequat DynamicMethod。我不确定是否理解。你想写一堆代码(这不是小事),这样你就不必更改调试器设置?@mikez-正确…我个人不在乎设置,但运行此代码的最终用户会关心,最终此代码将对最终用户不可用!但是调试器设置对最终用户没有影响。@mikez它会影响,因为最终用户也必须禁用该设置。他们不需要这样做,也不需要花很长时间在网络上寻找原因和方法…正如我所说,代码将无法使用-这里的目的是捕获异常,而不管visual studio调试器设置如何。您是否提供用户源代码?默认行为是打开“仅我的代码”,这样一些针对您的库进行编译的人不会看到您内部处理的异常。