Как создать универсальный метод Add для двух значений - PullRequest
0 голосов
/ 20 октября 2011

Например, если оба значения имеют тип int, они добавляют их .... т.е. 2+2=4

, если оба значения являются числами с плавающей точкой .... т.е.int ... т.е. 1 + Pak=1Pak

Мы получим эти два значения от пользователя, используя tfwo textboxes

Ответы [ 6 ]

2 голосов
/ 20 октября 2011

Это был бы один из способов сделать это. Без необходимости преобразования в строку, а затем обратно в числовое значение.

public object Add(IConvertible a, IConvertible b)
{
    if(IsNumeric(a) && IsNumeric(b))
        return a.ToDouble(CultureInfo.InvariantCulture) + b.ToDouble(CultureInfo.InvariantCulture);
    return a.ToString() + b.ToString();
}

public static bool IsNumeric(object o)
{
    var code = (int)Type.GetTypeCode(o.GetType());
    return code >= 4 && code <= 15;
}
1 голос
/ 20 октября 2011

Вы бы этого не сделали, дженерики не могут быть ограничены таким образом, чтобы поддерживать арифметические операторы (или конкатенацию). Вам необходимо создать перегрузки.

public int Add(int x, int y)
public double Add(double x, double y)
public decimal Add(decimal x, decimal y)
// etc.

Конечно, у вас все еще есть проблема определения, как именно анализировать ваши данные. Источником является TextBox, а данные будут по сути строками. Вам нужно будет определить тип номера, если он есть.

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

1 голос
/ 20 октября 2011

Вы не можете сделать это, используя дженерики. Вы все равно получите string из своего текстового поля. Единственное, что нужно сделать, это реализовать это «вручную» именно так, как вы сказали:

public string TrySumTwoStrings(string input1, string input2)
{
    double numeric1, numeric2;
    if (Double.TryParse(input1, out numeric1) && Double.TryParse(input2, out numeric2))
        return (numeric1 + numeric2).ToString();
    return input1 + input2;
}

Невозможно использовать дженерики, если у нас нет разных типов (здесь все напечатано как string).

0 голосов
/ 20 октября 2011

Извлечь http://www.yoda.arachsys.com/csharp/miscutil/ Библиотека MiscUtil. Он содержит некоторые очень умные вещи из дерева выражений, позволяющие операторам с обобщениями. Он не будет работать точно так, как вы хотите (как уже говорили другие, вы не можете ограничивать типы наличием операторов), но он должен делать именно то, что вы хотите.

Я не знаю, как он обрабатывает добавление различных типов вместе, хотя я не пробовал это.

0 голосов
/ 20 октября 2011
string Str1 = textBox1.Text.Trim();
string Str2 = textBox2.Text.Trim();

double Num1,num2;

bool isNum1 = double.TryParse(Str1, out Num1);
bool isNum2 = double.TryParse(Str2, out Num2);

if (isNum1 && isNum2)
MessageBox.Show((isNum1 + isNum2).ToString());
else
MessageBox.Show( Str1 + Str2);
0 голосов
/ 20 октября 2011

Я бы подумал, что потребуется некоторая обработка значений заранее для таких вещей, как String.PArse, Int.Parse и т. Д. ...

Сначала возьмите их в порядке сложности, потому что 1 будет преобразован в строку, однако x не будет преобразован в целое число или число с плавающей запятой.

Официально изменил мой ответ на тот же, что и комментарий ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...