Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创造行动<;Tᴺ&燃气轮机;或Func<;Tᴺ;,out TResult>;来自MethodInfo_C#_.net_Reflection_Functional Programming - Fatal编程技术网

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调试器设置如何。您是否提供用户源代码?默认行为是打开“仅我的代码”,这样一些针对您的库进行编译的人不会看到您内部处理的异常。