在像
之类的简单代码行中失望之后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;
}
}
}
这是非常错的吗?还是我在这里做点什么? (代码有效,顺便说一句)
答案 0 :(得分:1)
我将item.GetType() == typeof(T)
替换为item is T
。这样它就支持为您提供值类型作为您想要的基类。您可能还想考虑将您的方法作为扩展方法。
currentLetter跟踪用户表中的位置
我认为这不应该是会话状态。但是,如果不了解您的意思,那就很难确定。
答案 1 :(得分:1)
这对我来说似乎是正确的 - 但你可以从
中删除演员阵容return (T)defaultvalue;
到
return defaultvalue;
将defaultvalue定义为T。
答案 2 :(得分:1)
更多评论:
您可能想要使用以下内容代替item.GetType() == typeof(T)
:
typeof(T).IsAssignableFrom(item.GetType())
。
这将允许您支持阅读从T
。
那就是说,在你的具体情况下,如果我正确理解了这个场景,只有当条件item == null
为真时我才会返回默认值。
在您当前的代码中,如果调用者询问错误类型,调用者可能会获得返回的默认值,这可能会使调用者感到困惑,因为他无法知道某个值是否可用。
我冒险假设如果调用者试图使用错误的类型获取值,则由于错误而导致总是(并且例如由于无效的用户输入而导致),并且因此我宁愿在我身上加InvalidCastException
,以便修复错误(而不是通过返回默认值来隐藏错误)。