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;
}
您甚至可以将 as
与 TimeSpan?
一起使用。如果 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;
}
我有以下静态扩展 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;
}
您甚至可以将 as
与 TimeSpan?
一起使用。如果 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;
}