使用具有泛型类型的Parse方法?

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)

基本上,如果我正在使用intdouble我只是使用int.Parse等我已经尝试了铸造num1 = (T)temp;,这是行不通的.我怎样才能做到这一点,而无需编写自定义stringT发挥作用?

Tim*_*ora 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 ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

这假定您要转换的所有类型都实现IConvertible,这将允许您在解析器类上放置一个通用约束.如果并非所有类型都是可转换的,则需要根据类型(杂乱)切换转换方法.

如有必要,您还可以在自己的类型上实现IConvertible.有许多方法可以实现,但如果要处理原始值,通常不需要太长时间来实现.

http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx