如何在泛型函数中处理null Guid?

时间:2018-01-19 20:20:03

标签: c#

考虑

    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,因为没有为我工作

enter image description here

Update2 由于Guid不可为空,我认为我会寻找Guid.Empty的默认(Guid)。应该把它放在原始请求中。感谢大家的贡献。

2 个答案:

答案 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;