Я нечасто использовал дженерики и поэтому не могу понять, можно ли превратить следующие три метода в один, используя дженерики, чтобы уменьшить дублирование. На самом деле мой код в настоящее время имеет шесть методов, но если вы можете решить его для трех, тогда остальные должны работать в любом случае с тем же решением.
private object EvaluateUInt64(UInt64 x, UInt64 y)
{
switch (Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
private object EvaluateFloat(float x, float y)
{
switch(Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
private object EvaluateDouble(double x, double y)
{
switch (Operation)
{
case BinaryOp.Add:
return x + y;
case BinaryOp.Subtract:
return x - y;
case BinaryOp.Multiply:
return x * y;
case BinaryOp.Divide:
return x / y;
case BinaryOp.Remainder:
return x % y;
default:
throw new ApplicationException("error");
}
}
Я создаю простой синтаксический анализатор выражений, который затем должен оценивать простые бинарные операции, такие как сложение / вычитание и т. д. Я использую вышеуказанные методы для получения фактических математических расчетов, выполняемых с использованием соответствующих типов. Но должен быть лучший ответ!





Generics изначально не поддерживает арифметику. Однако это можно сделать с помощью .NET 3.5, вот так. Класс Operator является частью MiscUtil. Тогда это становится:
public T Evaluate<T>(T x, T y) {
switch (Operation)
{
case BinaryOp.Add:
return Operator.Add(x, y);
case BinaryOp.Subtract:
return Operator.Subtract(x, y);
... etc
Поскольку вы пишете синтаксический анализатор выражений, было бы неплохо использовать Expression напрямую, но вы можете использовать приведенное выше.
Может, мы просто считать, что ... когда-нибудь видели Бойцовский клуб?
@Eric: Я думаю, что он использует инъекцию зависимостей - я просто беспокоюсь, что у меня есть макет Rhino, а у Джона есть производственная версия ...
Это действительно здорово. Я все еще думаю, что MS должна была добавить поддержку операторов в дженерики :-(
Марк Гравелл проделал большую работу, чтобы сделать универсальную математику жизнеспособной. См. MiscUtil и общая статья о проблеме.
Код в текущей версии MiscUtil требует .NET 3.5 из-за использования деревьев выражений. Однако я считаю, что у Марка есть версия, которая также работает с .NET 2.0. Если бы это было полезно для людей, я уверен, что мы могли бы как-то включить его (возможно, с фасадом в самом MiscUtil, который будет использовать соответствующую реализацию на основе версии фреймворка во время выполнения).
В будущем я бы хотел увидеть статические интерфейсы, который мог бы предоставить альтернативный способ работы с универсальными математическими типами.
Наверное, надо будет 2.0 переделать - думаю сдох на HDD; Однажды я отправил вам копию по электронной почте - неужели она у вас все еще есть? Впрочем, это небольшой объем работы ...
Вполне возможно, что он у меня есть. Не могу проверить сейчас, но посмотрю позже, если вы напомните мне.
Вопреки распространенному мнению, мы с Марком на самом деле два разных человека. Просто мы, кажется, время от времени разделяем мнение.