C# преобразование TimeSpan в расширение HttpRequestMessage - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть следующий статус c Класс расширения:

public static class HttpRequestExtensions
{
    private static string TimeoutPropertyKey = "RequestTimeout";

    public static void SetTimeout(
        this HttpRequestMessage request,
        TimeSpan? timeout)
        {
        if ( request == null )
            throw new ArgumentNullException (nameof (request));

        request.Properties[TimeoutPropertyKey] = timeout;
        }

        public static TimeSpan? GetTimeout(this HttpRequestMessage request)
        {
        if ( request == null )
            throw new ArgumentNullException (nameof (request));

        if ( request.Properties.TryGetValue (
                TimeoutPropertyKey,
                out var value)
            && value is TimeSpan timeout )
            return timeout;
        return null;
        }
}

К сожалению, из-за разных сред я не могу использовать out var value (C# версии et c et c) и я вынужден изменить его, так же как value is TimeSpan timeout (не могу изменить параметры в IDE, C# версия и т. Д. c, хотя это совершенно хороший код).

У меня есть придумайте следующее

public static TimeSpan? GetTimeout(this HttpRequestMessage request)
{
    object value;
    TimeSpan ts = new TimeSpan();

    if ( request == null )
        throw new ArgumentNullException (nameof (request));

    if ( request.Properties.TryGetValue (
            TimeoutPropertyKey,
            out value)
        && value.GetType () == typeof (Timeout) )
        ts = TimeSpan.Parse (value.ToString());
    return ts;
}

Может кто-нибудь посоветовать мне, если это правильно, а если нет, предложить альтернативу? Большое спасибо ..

1 Ответ

1 голос
/ 13 февраля 2020

Вы можете просто проверить, содержит ли object в штучной упаковке TimeSpan, используя is, а затем распаковать его, используя приведение:

public static TimeSpan? GetTimeout(this HttpRequestMessage request)
{
    if ( request == null )
        throw new ArgumentNullException (nameof (request));

    object value;
    if ( request.Properties.TryGetValue(TimeoutPropertyKey, out value)
        && value is TimeSpan )
    {
        return (TimeSpan)value;
    }
    return null;
}

Вы даже можете использовать as с TimeSpan?. Это приводит к значению null, если value не содержит в штучной упаковке TimeSpan.

public static TimeSpan? GetTimeout(this HttpRequestMessage request)
{
    if ( request == null )
        throw new ArgumentNullException (nameof (request));

    object value;
    if ( request.Properties.TryGetValue(TimeoutPropertyKey, out value) )
    {
        return value as TimeSpan?;
    }
    return null;
}
...