考虑
public static T Get<T>(this ICache cache, string key)
{
var obj = cache.Get(key);
return (T)obj;
}
如果T恰好是Guid,并且obj为null(缓存中不存在),则会发生异常,因为Guid不能为空。是否可以让Get工作?我尝试添加typeof(T) == typeof(Guid)
支票,但是无法将Guid投入T. Puzzler!
更新 @mihai,因为没有为我工作
Update2 由于Guid不可为空,我认为我会寻找Guid.Empty的默认(Guid)。应该把它放在原始请求中。感谢大家的贡献。
答案 0 :(得分:3)
只需查看null
案例
public static T Get<T>(this ICache cache, string key)
{
var obj = cache.Get(key);
return obj == null ? default(T) : (T)obj;
}
但是现在你有一个不同的问题;如果T
是一个结构,你不知道返回的默认值是由于缓存返回null还是因为缓存的值实际上是默认值(如果Guid
是唯一的你期望的价值类型,这不是一个大问题,因为默认的Guid
并不是真正有效的Guid
。
解决方案?返回必要的信息以辨别两种情况:
public static bool TryGet<T>(this ICache cache, string key, out T result)
{
var obj = cache.Get(key);
if (obj == null)
{
result = default(T);
return false;
}
result = (T)obj;
return true;
}
答案 1 :(得分:1)
尝试
if (obj == null)
return default(T);
else
return (T)obj;