方法返回委托,它是来自参数的委托的乘法值

时间:2016-01-19 13:31:07

标签: c# delegates

我需要定义方法,它将参数作为参数获得两个委托,并返回委托(这将从参数中多次返回此委托)。现在我有这样的,但我不能使它成为可编译的。你能给出一些建议或回答吗?我将非常感激。

public Delegate MathP(Delegate mydelegate, Delegate mydelegate2)
    {

        return (Delegate) Delegate.CreateDelegate Delegate (int x, int y) {
                 int results = (int)mydelegate.DynamicInvoke(x, y);
                 int results2 = (int)mydelegate2.DynamicInvoke(x, y);

                 return results* results2;
            };
    }

2 个答案:

答案 0 :(得分:3)

如果您可以将代表重写为Func,则可以轻松完成:

public Func<int, int, int> MathP
    ( Func<int, int, int> mydelegate
    , Func<int, int, int> mydelegate2
    )
{
    return new Func<int, int, int>
        ( (x, y) => mydelegate(x, y) * mydelegate2(x, y)
        );
}

答案 1 :(得分:2)

您最好使用表达式树。 此方法将产生您期望的结果:

static Delegate Combine(Delegate first, Delegate second)
{
    var firstParam = Expression.Parameter(typeof(int));
    var secondParam = Expression.Parameter(typeof(int));

    var expression = Expression.Lambda<Func<int, int, int>>(
        Expression.Multiply(
            Expression.Call(first.GetMethodInfo(), firstParam, secondParam),
            Expression.Call(second.GetMethodInfo(), firstParam, secondParam)),
        firstParam,
        secondParam);

    return expression.Compile();
}

此外,您可以在方法签名中将Delegate替换为Func<int,int,int>,以便更快地调用结果并调用Combine方法本身 - 类型安全。

请记住,以这种方式获得的代理最好是缓存,否则编译lambda的开销将是很大的。

另一种方法,简单且效率较低的方法是:

static Delegate CombineSimple(Delegate first, Delegate second)
{
    return new Func<int, int, int>(
        (firstParam, secondParam) => 
            (int)first.DynamicInvoke(firstParam, secondParam) *
            (int)second.DynamicInvoke(firstParam, secondParam));
}