为运营商预先制作的代表?

时间:2013-02-24 19:20:56

标签: c#

假设我想使用加法运算符(+)作为委托,我该如何将其传递给方法?

寻找与Python的operator.add类似的东西。

例如,而不是

var center = _drawingPoly.Aggregate((a, b) => a + b)/_drawingPoly.Count;

我想写一些类似的东西:

var center = _drawingPoly.Aggregate(operator+)/_drawingPoly.Count;

(仅供参考,此处+超载)

2 个答案:

答案 0 :(得分:3)

没有任何内置功能,但你可以使用表达式树来实现:

public static Func<T, T, T> OpAdd<T>()
{
    var param1Expr = Expression.Parameter(typeof(T));
    var param2Expr = Expression.Parameter(typeof(T));
    var addExpr = Expression.Add(param1Expr, param2Expr);
    var expr = Expression.Lambda<Func<T, T, T>>(addExpr, param1Expr, param2Expr);

    return expr.Compile();
}

然后您可以使用:

var center = _drawingPoly.Aggregate(OpAdd<int>())/_drawingPoly.Count;

遗憾的是,这种方法不是类型安全的,您可能希望缓存创建的结果委托。

答案 1 :(得分:2)

唉,这种语言没有这样的功能。