【问题标题】:C# TimeSpan conversion in HttpRequestMessage ExtensionHttpRequestMessage 扩展中的 C# TimeSpan 转换
【发布时间】:2020-02-13 15:33:48
【问题描述】:

我有以下静态扩展类:

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#版本etcetc,尽管这是非常好的代码)。

我想出了下面的

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;
}

如果这正确,有人可以告诉我,如果不是,建议一个替代方案?非常感谢。。

【问题讨论】:

  • value.GetType () == typeof (Timeout) 看起来不正确,也许是value.GetType () == typeof (TimeSpan) ?或使用is 运算符
  • 真正有问题的部分是TimeSpan.Parse (value.ToString())...

标签: c# timeout httprequest timespan


【解决方案1】:

您可以使用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;
}

【讨论】:

  • 太棒了,非常感谢,我确定我错了。谢谢。
猜你喜欢
  • 2012-09-10
  • 2016-02-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多