2011-08-29 209 views
0

越来越辜负了一个简单的代码行像这种泛型使用是否正确?

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; 
     } 

    } 
} 

这是非常错误的吗?或者我在这里做什么? (代码工程,顺便说一句)

+1

你可以使它成为一个扩展方法.. –

+0

'defaultValue'已经是'T'类型 - 那么为什么在else子句中强制转换呢? –

+0

这是我第一次尝试制作通用方法。所以我不知道该怎么做:) @CD:什么扩展方法? HttpSessionStateBase? –

回答

1

一些更多的评论:

  1. 而不是item.GetType() == typeof(T),您可能想要使用:

    typeof(T).IsAssignableFrom(item.GetType())。 这将让您支持读取从T派生的类型。

  2. 这就是说,在您的具体情况下,如果我正确理解方案,只有在条件item == null为真时,我才会返回默认值。

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

    我会冒险的假设:如果呼叫者试图使用错误的类型得到一个值,这是总是由于一个错误(而不是例如由于非法用户输入),因此,我宁愿有一个InvalidCastException引发我,以便该错误可以修复(而不是通过返回默认值隐藏的错误)。

+0

这是真的。并且使我更难将_one_答案标记为正确:) –

1

我会用item is T替换item.GetType() == typeof(T)。这样它支持给你一个值类型作为你想要的基类。你可能想考虑让你的方法也是一个扩展方法。

currentLetter跟踪的位置在用户表

我觉得这不应该是摆在首位的会话状态。但是,如果不了解更多关于你的意思,那很难确定。

+0

有太多的用户,我一次只能在一个表中列出一个字母。 “索引”方法采用可选的“字母”变量。如果为空,则等于“A”。在对单个用户执行一些操作(例如编辑)之后,我使用“currentLetter”不跳回到“A”。 “currentLetter”会话变量仅在Index方法中设置。 –

+0

@Chris但是,为什么这是在会议中,而不是在某种形式的网址的一部分? (例如作为查询参数)。您当前的代码完全与多个选项卡分开。 – CodesInChaos

+0

这是一个很好的问题,属于“我没有想过那个” - 类别... –

1

这似乎是我的权利 - 但你可以从

return (T)defaultvalue; 

去除投至T到

return defaultvalue; 

你定义默认值是T.