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

时间:2012-01-04 08:05:54

标签: c# parsing generics 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
    }

基本上,如果我使用的是intdouble,我会使用int.Parse等等。我尝试过投放num1 = (T)temp;,但这不起作用。如何在不必编写自定义stringT功能的情况下执行此操作?

2 个答案:

答案 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);
    }