HttpRequestMessage 扩展中的 C# TimeSpan 转换

C# TimeSpan conversion in HttpRequestMessage Extension

我有以下静态扩展 class:

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#版本等),我不得不更改它,与value is TimeSpan timeout一样(无法更改IDE 中的参数、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;
}

有人可以告诉我这是否正确,如果不正确,请提出替代方案?非常感谢..

您可以使用 is 简单地测试 object 是否包含装箱的 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)
        && value is TimeSpan )
    {
        return (TimeSpan)value;
    }
    return null;
}

您甚至可以将 asTimeSpan? 一起使用。如果 value 不包含盒装的 TimeSpan.

,这将导致 null
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;
}