如何将枚举值保存到会话中?

4
我正在创建一个枚举属性,这个属性应该保存到会话中。我的代码在这里:
```csharp public enum TPageMode { Edit=1,View=2,Custom=3} ```
       protected TPageMode Mode { 
            get{
                if (Session["Mode"] == null)
                    return TPageMode.Edit;
                else
                {
                    return Session["Mode"] as TPageMode; // This row is problem
                }                
            }
            set {
                Session["Mode"] = value;
            } 
        }

编译器在return Session["Mode"] as TPageMode处发生错误

as运算符必须与引用类型或可空类型一起使用

当我将此行替换为

return Enum.Parse(typeof(TPageMode), Session["Mode"].ToString());

显示以下错误:

无法将类型 'object' 隐式转换为 'TPageMode'

如何从会话中读取枚举值?

2个回答

9

试试这个:

return (TPageMode) Session["Mode"];

正如错误信息所说,“as”不能用于非空值类型。如果您随后将其转换为正确的类型,则Enum.Parse将起作用(效率低下):
return (TPageMode) Enum.Parse(Session["Mode"], typeof(TPageMode));

1

代码

return Session["Mode"] as TPageMode

返回一个错误,因为TPageMode不是引用类型。

as运算符是C#中一种特殊的基于反射的类型转换。它检查左操作数是否可以转换为右侧的类型。如果转换可能,则表达式返回null。由于TPageMode是基于值类型的枚举,因此它不能保存值null。因此,在此示例中无法使用该运算符。

要执行此类型转换,只需使用

return (TPageMode) Session["Mode"];

使用这种语法,如果转换不可能,运行时会抛出一个InvalidCastException。在正常情况下您确信转换始终应该是可能的时,请使用此语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接