class ArithmeticExpressionParser<T> : Parser where T : IConvertible
{
T num1, num2;
/* ......... */
void ParseNumber()
{
string temp = String.Empty;
while (char.IsDigit(PeekNextToken()))
{
GetNextToken();
temp += Token;
}
//num1 = T.Parse(temp); // <<< the problem
num1 = (T)Convert.ChangeType( temp, typeof( T ) );
}
}
Это предполагает, что все типы, которые вы конвертируете, реализуют IConvertible
, что позволит вам наложить универсальное ограничение на ваш класс анализатора. Если не все типы являются конвертируемыми, вам нужно будет переключать методы преобразования в зависимости от типа (грязный).
При необходимости вы также можете реализовать IConvertible для своих типов. Есть много методов для реализации, но если вы имеете дело с примитивными значениями, обычно это не займет много времени.
http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx