2013-02-24 3 views
3

Предположим, что я хочу использовать оператор сложения (+) в качестве делегата, как бы передать это методу?Готовые делегаты для операторов?

Ищет нечто похожее на Python's operator.add.

например, вместо

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

Я хотел бы написать что-то вроде:

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

(FYI, + перегружен здесь)

+0

Если перегружает этот оператор, вместо этого используется перегрузка – BlackBear

+0

@BlackBear: Да ..... это то, что я хочу. – mpen

ответ

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; 

, к сожалению, этот подход не типобезопасным, и вы, вероятно, захотите кэшировать созданные делегаты.

+0

@Mark. Вам нужно будет набрать их как «Делегировать» или «объект» и отбросить их при возврате из кеша. – Lee

2

Увы, язык не имеют такую ​​особенность.

Смежные вопросы