Можете ли вы использовать .NET 4.0? Если это так, то с помощью динамической типизации становится очень просто:
private object Combine(dynamic o, dynamic o1)
{
// Assumes an appropriate addition operator, found at execution time
return o + o1;
}
Другая альтернатива - иметь карту делегатов для каждой пары возможных типов. К сожалению, до .NET 4.0 не было типа Tuple
, поэтому вам придется определить свой собственный тип TypePair
в качестве ключа карты. Конечно, вам нужно убедиться, что вы охватили каждую возможную пару ... но по крайней мере компилятор может помочь, когда у вас есть подходящий метод "AddDelegate":
private void AddDelegate<T1, T2>(Func<T1, T2, object> sumFunction)
{
// Put the function in the map
...
}
AddDelegate<int,int>((x, y) => x + y);
AddDelegate<int,float>((x, y) => x + y);
AddDelegate<int,string>((x, y) => x + y);
AddDelegate<float,int>((x, y) => x + y);
AddDelegate<float,float>((x, y) => x + y);
AddDelegate<float,string>((x, y) => x + y);
...
Кстати, я взял bool
из этого, поскольку «сложение» между bool
и float
(например) не имеет никакого смысла. Вы можете решить, как вы хотите их объединить.
Хотя, как говорит Митч, я бы пересмотрел ваши дизайнерские решения - вы уверены, что действительно это нужно? Это довольно странное требование. Можете ли вы рассказать нам что-нибудь о большей картине? Мы можем предложить альтернативные подходы.