这种泛型使用是否正确?
越来越辜负了一个简单的代码行像这种泛型使用是否正确?
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;
}
}
}
这是非常错误的吗?或者我在这里做什么? (代码工程,顺便说一句)
一些更多的评论:
-
而不是
item.GetType() == typeof(T)
,您可能想要使用:typeof(T).IsAssignableFrom(item.GetType())
。 这将让您支持读取从T
派生的类型。 -
这就是说,在您的具体情况下,如果我正确理解方案,只有在条件
item == null
为真时,我才会返回默认值。在您当前的代码中,如果调用者询问错误的类型,可能会返回默认值,这可能会让调用者感到困惑,因为他无法知道值是否可用。
我会冒险的假设:如果呼叫者试图使用错误的类型得到一个值,这是总是由于一个错误(而不是例如由于非法用户输入),因此,我宁愿有一个
InvalidCastException
引发我,以便该错误可以修复(而不是通过返回默认值隐藏的错误)。
这是真的。并且使我更难将_one_答案标记为正确:) –
我会用item is T
替换item.GetType() == typeof(T)
。这样它支持给你一个值类型作为你想要的基类。你可能想考虑让你的方法也是一个扩展方法。
currentLetter跟踪的位置在用户表
我觉得这不应该是摆在首位的会话状态。但是,如果不了解更多关于你的意思,那很难确定。
有太多的用户,我一次只能在一个表中列出一个字母。 “索引”方法采用可选的“字母”变量。如果为空,则等于“A”。在对单个用户执行一些操作(例如编辑)之后,我使用“currentLetter”不跳回到“A”。 “currentLetter”会话变量仅在Index方法中设置。 –
@Chris但是,为什么这是在会议中,而不是在某种形式的网址的一部分? (例如作为查询参数)。您当前的代码完全与多个选项卡分开。 – CodesInChaos
这是一个很好的问题,属于“我没有想过那个” - 类别... –
这似乎是我的权利 - 但你可以从
return (T)defaultvalue;
去除投至T到
return defaultvalue;
你定义默认值是T.
你可以使它成为一个扩展方法.. –
'defaultValue'已经是'T'类型 - 那么为什么在else子句中强制转换呢? –
这是我第一次尝试制作通用方法。所以我不知道该怎么做:) @CD:什么扩展方法? HttpSessionStateBase? –