Общий анализатор строковых значений в Enum - PullRequest
3 голосов
/ 14 июня 2011

У меня странный вопрос о разборе перечислений из строк.На самом деле, мое приложение должно обрабатывать несколько перечислений из файла конфигурации.Однако я не хочу писать процедуры синтаксического анализа для каждого типа перечисления (поскольку их много).

Проблема, с которой я сталкиваюсь, заключается в том, что следующий код показывает некоторую странную ошибку - Тип T долженбыть необнуляемым типом значения или чем-то в этом роде.Я думал, что перечисления по умолчанию не обнуляются?

Если я ограничу тип T с помощью where T : enum, все остальное внутри тела метода (кроме оператора if Enum.TryParse) будет подчеркнуто как ошибка.

Может кто-нибудь помочь сэта странная мелкая проблема?

Спасибо, Мартин

public static T GetConfigEnumValue<T>(NameValueCollection config,
                                      string configKey, 
                                      T defaultValue) // where T : enum ?
{
    if (config == null)
    {
        return defaultValue;
    }

    if (config[configKey] == null)
    {
        return defaultValue;
    }

    T result = defaultValue;
    string configValue = config[configKey].Trim();

    if (string.IsNullOrEmpty(configValue))
    {
        return defaultValue;
    }

    //Gives me an Error - T has to be a non nullable value type?
    if( ! Enum.TryParse<T>(configValue, out result) )
    {
        result = defaultValue;
    }

    //Gives me the same error:
    //if( ! Enum.TryParse<typeof(T)>(configValue, out result) )  ...

    return result;
}

Пользователь попросил опубликовать текст ошибки (это время кода, а не время компиляции / выполнения), так что все идет:

Тип 'T' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра TEnum в универсальном типе или методе 'System.Enum.TryParse (string, out TEnum)'

Ответы [ 4 ]

1 голос
/ 17 июня 2011
public static T GetConfigEnumValue<T>(NameValueCollection config, string configKey, T defaultValue)
{
    if (config == null)
    {
        return defaultValue;
    }

    if (config[configKey] == null)
    {
        return defaultValue;
    }

    T result = defaultValue;
    string configValue = config[configKey].Trim();

    if (string.IsNullOrEmpty(configValue))
    {
        return defaultValue;
    }

    try
    {
        result = (T)Enum.Parse(typeof(T), configValue, true);
    }
    catch
    {
        result = defaultValue;
    }

    return result;
}
1 голос
/ 14 июня 2011

Хорошо, учитывая эту информацию, я вижу, на что жалуется метод Enum.TryParse.

накладывает общее ограничение на метод следующим образом:

public static T GetConfigEnumValue<T>(NameValueCollection config, 
                                      string configKey, 
                                      T defaultValue) // where T : ValueType

просто поместите то же ограничение, что и для метода Enum.TryParse.

where T : struct, new()

Вы можете найти это определение здесь:

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

0 голосов
/ 14 июня 2011
0 голосов
/ 14 июня 2011

Так как C # не позволит вам сделать where T : enum, вы должны использовать where T : struct.

Обратите внимание, что существуют ограничения на это ограничение, как Майкл предложил.

...