Использование метода разбора с универсальным типом? - PullRequest
2 голосов
/ 04 января 2012

Прямо к коду:

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?

Ответы [ 2 ]

9 голосов
/ 04 января 2012
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

3 голосов
/ 04 января 2012

Используйте 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...