App*_*ker 2 c# generics parsing c#-4.0
直接代码:
class ArithmeticExpressionParser<T> : Parser
{
T num1, num2;
/* ......... */
void ParseNumber()
{
string temp = String.Empty;
while (char.IsDigit(PeekNextToken()))
{
GetNextToken();
temp += Token;
}
num1 = T.Parse(temp); // <<< the problem
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果我正在使用int或double我只是使用int.Parse等我已经尝试了铸造num1 = (T)temp;,这是行不通的.我怎样才能做到这一点,而无需编写自定义string来T发挥作用?
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 ) );
}
}
Run Code Online (Sandbox Code Playgroud)
这假定您要转换的所有类型都实现IConvertible,这将允许您在解析器类上放置一个通用约束.如果并非所有类型都是可转换的,则需要根据类型(杂乱)切换转换方法.
如有必要,您还可以在自己的类型上实现IConvertible.有许多方法可以实现,但如果要处理原始值,通常不需要太长时间来实现.
http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx