Преобразуйте строку в nullable тип (интервал, дважды, и т.д. …)

да, вы можете добиться этого, назначив идентификатор экрана перед вызовом объекта helproute. Если вы хотите, чтобы screen_id был динамическим, вам необходимо сначала передать значение объекту. См. Пример,

   let helpRoutes = {};
    for(let screen_id=0;screen_id<10;screen_id++){
        helpRoutes[`wizard/${screen_id}/step1`] =`This is help content for step ${screen_id}`;
    }
[ 113] После присвоения значения Helproutes вы можете получить значение.

helpRoutes['wizard/2/step1']
135
задан Patrick 30 April 2019 в 12:52
поделиться

8 ответов

Еще одна вещь, которую нужно иметь в виду, это то, что сама строка может быть нулевой.

public static Nullable<T> ToNullable<T>(this string s) where T: struct
{
    Nullable<T> result = new Nullable<T>();
    try
    {
        if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0)
        {
            TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
            result = (T)conv.ConvertFrom(s);
        }
    }
    catch { } 
    return result;
}
151
ответ дан 23 November 2019 в 23:44
поделиться
public static class GenericExtension
{
    public static T? ConvertToNullable<T>(this String s) where T : struct 
    {
        try
        {
            return (T?)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(s);
        }
        catch (Exception)
        {
            return null;
        }
    }
}
3
ответ дан 23 November 2019 в 23:44
поделиться

Обойти это невозможно. Nullable, как и ваш метод, ограничен использованием только типов значений в качестве аргумента. String является ссылочным типом и, следовательно, несовместим с этим объявлением.

3
ответ дан 23 November 2019 в 23:44
поделиться

Дайте этому шанс ...

public delegate bool TryParseDelegate<T>(string data, out T output);

public static T? ToNullablePrimitive<T>(this string data, 
    TryParseDelegate<T> func) where T:struct
{
    string.IsNullOrEmpty(data) return null;

    T output;

    if (func(data, out output))
    {
        return (T?)output;
    }

    return null;
}

Затем назовите это так ...

void doStuff()
{
    string foo = "1.0";

    double? myDouble = foo.ToNullablePrimitive<double>(double.TryParse);

    foo = "1";

    int? myInt = foo.ToNullablePrimitive<int>(int.TryParse);

    foo = "haha";

    int? myInt2 = foo.ToNullablePrimitive<int>(int.TryParse);
}
6
ответ дан 23 November 2019 в 23:44
поделиться

You might want to try:

TypeConverter conv = TypeDescriptor.GetConverter(typeof(int));
conv.ConvertFrom(mystring);

do your own null check and return int? if necessary. You'll also want to wrap that in a try {}

9
ответ дан 23 November 2019 в 23:44
поделиться

Что по этому поводу:


double? amount = string.IsNullOrEmpty(strAmount) ? (double?)null : Convert.ToDouble(strAmount);

Конечно, это не учитывает неудачу конвертации.

25
ответ дан 23 November 2019 в 23:44
поделиться

Вы можете попробовать использовать следующий метод расширения:

public static T? GetValueOrNull<T>(this string valueAsString)
    where T : struct 
{
    if (string.IsNullOrEmpty(valueAsString))
        return null;
    return (T) Convert.ChangeType(valueAsString, typeof(T));
}

Таким образом, вы можете сделать это:

double? amount = strAmount.GetValueOrNull<double>();
int? amount = strAmount.GetValueOrNull<int>();
decimal? amount = strAmount.GetValueOrNull<decimal>();
53
ответ дан 23 November 2019 в 23:44
поделиться

Я написал этот преобразователь универсального типа. Он работает с значениями Nullable и стандартными значениями, конвертируя между всеми конвертируемыми типами, а не только строкой. Он обрабатывает все возможные сценарии (значения по умолчанию, нулевые значения, другие значения и т. Д.)

Я использую это около года в десятках производственных программ, так что это должно быть довольно твердый.

    public static T To<T>(this IConvertible obj)
    {
        Type t = typeof(T);

        if (t.IsGenericType
            && (t.GetGenericTypeDefinition() == typeof(Nullable<>)))
        {
            if (obj == null)
            {
                return (T)(object)null;
            }
            else
            {
                return (T)Convert.ChangeType(obj, Nullable.GetUnderlyingType(t));
            }
        }
        else
        {
            return (T)Convert.ChangeType(obj, t);
        }
    }

    public static T ToOrDefault<T>
                 (this IConvertible obj)
    {
        try
        {
            return To<T>(obj);
        }
        catch
        {
            return default(T);
        }
    }

    public static bool ToOrDefault<T>
                        (this IConvertible obj,
                         out T newObj)
    {
        try
        {
            newObj = To<T>(obj);
            return true;
        }
        catch
        {
            newObj = default(T);
            return false;
        }
    }

    public static T ToOrOther<T>
                           (this IConvertible obj,
                           T other)
    {
        try
        {
            return To<T>(obj);
        }
        catch
        {
            return other;
        }
    }

    public static bool ToOrOther<T>
                             (this IConvertible obj,
                             out T newObj,
                             T other)
    {
        try
        {
            newObj = To<T>(obj);
            return true;
        }
        catch
        {
            newObj = other;
            return false;
        }
    }

    public static T ToOrNull<T>
                          (this IConvertible obj)
                          where T : class
    {
        try
        {
            return To<T>(obj);
        }
        catch
        {
            return null;
        }
    }

    public static bool ToOrNull<T>
                      (this IConvertible obj,
                      out T newObj)
                      where T : class
    {
        try
        {
            newObj = To<T>(obj);
            return true;
        }
        catch
        {
            newObj = null;
            return false;
        }
    }
22
ответ дан 23 November 2019 в 23:44
поделиться