直接代码:
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
}
基本上,如果我使用的是int
或double
,我会使用int.Parse
等等。我尝试过投放num1 = (T)temp;
,但这不起作用。如何在不必编写自定义string
至T
功能的情况下执行此操作?
答案 0 :(得分:9)
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
答案 1 :(得分:3)
使用Convert.ChangeType
进行转换。以下代码应适用于所有简单类型和
public static T Parse<T>(this string source)
{
if (typeof(T).IsSubclassOf(typeof(Enum)))
{
return (T)Enum.Parse(typeof(T), source, true);
}
if (!String.IsNullOrEmpty(source))
return (T)Convert.ChangeType(source, typeof(T));
return default(T);
}