2010-11-03 5 views
2

Я думаю, что это значительно упростит перегрузку функции, если бы я мог просто написать случай, который принимает большинство параметров, а затем просто заставляет каждый случай иметь меньше параметров с фиктивными параметрами. Например:Есть ли способ сделать функцию

// Add two integers 
Func<int, int, int> addInts = (x, y) => { return x + y; }; 

// Add one to an integer 
Func<int, int> addOne = (x) => { return x++; }; 

// In this case Func takes 2 args and has 1 return 
public int IntCalc(Func<int,int,int> operation, int param1, int param2) 
{ 
    return operation(param1, param2); 
} 

// In this case Func takes 1 arg and has 1 return 
public int IntCalc(Func<int, int> operation, int param1, int param2) 
{ 
    // This cast would allow me to do the overload 
    Func<int, int, int> castedOperation = (Func<int, int, int>)addOne; 
    return IntCalc(castedOperation, param1, 0); 
} 

Так есть способ сделать это? Это ужасная практика?

ответ

2

Вы можете использовать только в том случае, если сигнатуры параметров совместимы. В вашем случае вам нужно определить lamda, поскольку преобразование функции с одним параметром в функцию с двумя параметрами вообще не имеет смысла.

Func<int, int, int> castedOperation = (i1,i2)=>addOne(i1); 

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

В качестве опоры для вашей дополнительной функции действительно уродливый. Хотя приращение x не действует, потому что параметр копируется, и, таким образом, только копия увеличивается и уменьшается, ее реализация как return x+1; будет намного лучше, чем return x++;, поскольку вы на самом деле не хотите изменять x.

1

Помимо принятого ответа, вы также должны изменить операцию addOne. Таким образом, полная функция будет

// In this case Func takes 1 arg and has 1 return 
public int IntCalc(Func<int, int> operation, int param1, int param2) 
{ 
    // This cast would allow me to do the overload 
    Func<int, int, int> castedOperation = (i1,i2)=>operation(i1); 
    return IntCalc(castedOperation, param1, 0); 
} 
1

Если все параметры имеют одинаковый тип вы можете использовать params

adder(bool sample, params int[] a) 
{ 
    .... 
} 

adder(2,3,4); 

также вы можете использовать Named Parameter в C# 4.0.

Ваш подход полезен в конструкторах (вы можете сделать это с ними).

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