这种泛型的使用是否正确?

时间:2011-08-29 11:27:47

标签: c# asp.net session

在像

之类的简单代码行中失望之后
char _letter = (char)Session["currentLetter"];

会话重置失败,我发现我想尝试一些东西。 (currentLetter跟踪用户表中的位置)

public static class SessionManager
{
    public static T ValueOrDefault<T>(HttpSessionStateBase session, string sessionkey, T defaultvalue)
    {
        object item = session[sessionkey];
        if (item != null && item.GetType() == typeof(T))
        {
            return (T)item;
        }
        else
        {
            return (T)defaultvalue;
        }

    }
}

这是非常错的吗?还是我在这里做点什么? (代码有效,顺便说一句)

3 个答案:

答案 0 :(得分:1)

我将item.GetType() == typeof(T)替换为item is T。这样它就支持为您提供值类型作为您想要的基类。您可能还想考虑将您的方法作为扩展方法。

  

currentLetter跟踪用户表中的位置

我认为这不应该是会话状态。但是,如果不了解您的意思,那就很难确定。

答案 1 :(得分:1)

这对我来说似乎是正确的 - 但你可以从

中删除演员阵容
return (T)defaultvalue;

return defaultvalue;

将defaultvalue定义为T。

答案 2 :(得分:1)

更多评论:

  1. 您可能想要使用以下内容代替item.GetType() == typeof(T)

    typeof(T).IsAssignableFrom(item.GetType())。 这将允许您支持阅读从T

  2. 派生的类型
  3. 那就是说,在你的具体情况下,如果我正确理解了这个场景,只有当条件item == null为真时我才会返回默认值。

    在您当前的代码中,如果调用者询问错误类型,调用者可能会获得返回的默认值,这可能会使调用者感到困惑,因为他无法知道某个值是否可用。

    我冒险假设如果调用者试图使用错误的类型获取值,则由于错误而导致总是(并且例如由于无效的用户输入而导致),并且因此我宁愿在我身上加InvalidCastException,以便修复错误(而不是通过返回默认值来隐藏错误)。