C# 使用泛型类型的解析方法?

C# 使用泛型类型的解析方法?,c#,parsing,generics,c#-4.0,C#,Parsing,Generics,C# 4.0,直接进入代码: class ArithmeticExpressionParser<T> : Parser { T num1, num2; /* ......... */ void ParseNumber() { string temp = String.Empty; while (char.IsDigit(PeekNextToken())) { GetNextToken();

直接进入代码:

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
    }
类算术表达式解析器:解析器
{
T num1,num2;
/* ......... */
void ParseNumber()
{
字符串温度=字符串为空;
while(char.IsDigit(peek nextToken()))
{
GetNextToken();
temp+=令牌;
}

num1=T.Parse(temp);//使用
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);
    }
publicstatict解析(此字符串源)
{            
if(typeof(T).IsSubclassOf(typeof(Enum)))
{
返回(T)Enum.Parse(typeof(T),source,true);
}
如果(!String.IsNullOrEmpty(源))
return(T)Convert.ChangeType(source,typeof(T));
返回默认值(T);
}
类算术表达式解析器:解析器,其中T:IConvertible
{
T num1,num2;
/* ......... */
void ParseNumber()
{
字符串温度=字符串为空;
while(char.IsDigit(peek nextToken()))
{
GetNextToken();
temp+=令牌;
}

//num1=T.Parse(temp);//感觉您想要一个
IParsable
,但是
IConvertible
更具包容性(并且存在)通过使用Convert.ChangeType,当T是值类型时,就有了装箱。然而,Convert.ChangeType会导致装箱,这可以通过使用一组方法重载来避免。@phoog-方法重载在这种情况下不起作用,因为类型的差异在于返回类型,而不是参数类型-参数始终是字符串,因此重载是n不适用。@DaveRael很好,我用了一个错误的词。我的意思是指一组在方法名称中包含类型名称的方法,如
X.ParseDouble
X.ParseByte
,这与
X.Parse
X.Parse
一样,只不过是键入而已。
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 ) );
    }
}