Преобразование Null в Nullable Enum (универсальный) - PullRequest
3 голосов
/ 28 сентября 2010

Я пишу некоторые функциональные возможности Enum, и у меня есть следующее:

public static T ConvertStringToEnumValue<T>(string valueToConvert, 
    bool isCaseSensitive)
{
    if (String.IsNullOrWhiteSpace(valueToConvert))
        return (T)typeof(T).TypeInitializer.Invoke(null);

    valueToConvert = valueToConvert.Replace(" ", "");
    if (typeof(T).BaseType.FullName != "System.Enum" &&
        typeof(T).BaseType.FullName != "System.ValueType")
    {
        throw new ArgumentException("Type must be of Enum and not " +
            typeof (T).BaseType.FullName);
    }

    if (typeof(T).BaseType.FullName == "System.ValueType")
    {
        return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)),
            valueToConvert, !isCaseSensitive);
    }

    return (T)Enum.Parse(typeof(T), valueToConvert, !isCaseSensitive);
}

Теперь я называю это следующим:

EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat");

Это работает, как и ожидалось.Тем не менее, если я запустил это:

EnumHelper.ConvertStringToEnumValue<Enums.Animals?>(null);

, это обрывается с ошибкой, что TypeInitializer нулевой.

Кто-нибудь знает, как решить эту проблему?

Спасибо всем!

Ответы [ 3 ]

9 голосов
/ 28 сентября 2010

1001 * попробовать *

if (String.IsNullOrWhiteSpace(valueToConvert))
              return default(T);
0 голосов
/ 24 февраля 2017

Этот выполняет свою работу, и он также выглядит красиво. Надеюсь, это поможет!

    /// <summary>
    /// <para>More convenient than using T.TryParse(string, out T). 
    /// Works with primitive types, structs, and enums.
    /// Tries to parse the string to an instance of the type specified.
    /// If the input cannot be parsed, null will be returned.
    /// </para>
    /// <para>
    /// If the value of the caller is null, null will be returned.
    /// So if you have "string s = null;" and then you try "s.ToNullable...",
    /// null will be returned. No null exception will be thrown. 
    /// </para>
    /// <author>Contributed by Taylor Love (Pangamma)</author>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="p_self"></param>
    /// <returns></returns>
    public static T? ToNullable<T>(this string p_self) where T : struct
    {
        if (!string.IsNullOrEmpty(p_self))
        {
            var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
            if (converter.IsValid(p_self)) return (T)converter.ConvertFromString(p_self);
            if (typeof(T).IsEnum) { T t; if (Enum.TryParse<T>(p_self, out t)) return t;}
        }

        return null;
    }

https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions

0 голосов
/ 10 апреля 2016

У меня другой подход, использующий расширение и дженерики.

public static T ToEnum<T>(this string s) {
    if (string.IsNullOrWhiteSpace(s))
        return default(T);

    s = s.Replace(" ", "");
    if (typeof(T).BaseType.FullName != "System.Enum" &&
        typeof(T).BaseType.FullName != "System.ValueType") {
        throw new ArgumentException("Type must be of Enum and not " + typeof(T).BaseType.FullName);
    }

    if (typeof(T).BaseType.FullName == "System.ValueType")
        return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), s, true);

    return (T)Enum.Parse(typeof(T), s, true);
}

Используйте вот так ...

Gender? g = "Female".ToEnum<Gender?>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...