动态变量到会话

时间:2018-03-09 10:20:23

标签: c# session dynamic

有没有办法在会话中存储动态变量?

我试过这种方式

public dynamic MSG
{
    get
    {
        var obj = _context.HttpContext.Session.GetString("MSG");
        return string.IsNullOrEmpty(obj) ? null : JsonConvert.DeserializeObject<dynamic>(obj);
    }
    set
    {
        if (value == null) throw new ArgumentNullException(nameof(value));
        _context.HttpContext.Session.SetString("MSG", JsonConvert.SerializeObject(value));
    }
}

但是出现编译错误

  

严重级代码描述项目文件行抑制状态   错误CS1973'ISession'没有名为'SetString'的适用方法但是   似乎有一个名称的扩展方法。扩展方法   无法动态调度。考虑投射动态   参数或调用扩展方法而不使用扩展方法   语法。

3 个答案:

答案 0 :(得分:1)

只需执行错误消息即可。要么不使用无法动态调度的扩展方法,要么显式使用扩展方法,要么只将动态值转换为适当的类型:

_context.HttpContext.Session.SetString("MSG", (string) JsonConvert.SerializeObject(value));

答案 1 :(得分:0)

使用以下代码。

_context.HttpContext.Session.SetString("MSG", JsonConvert.SerializeObject(value)ToString());

答案 2 :(得分:0)

尚不支持在扩展方法中使用动态类型。 您应该转换值:

JsonConvert.SerializeObject(value)

做这样的事情应该有效:

_context.HttpContext.Session.SetString("MSG", JsonConvert.SerializeObject(value).ToString());

或者使用其他方法,例如Add如果存在:

_context.HttpContext.Session.Add("MSG", JsonConvert.SerializeObject(value));

更新

我只是设置了一点测试。 通过让财产结构如此,我没有遇到任何问题:

public dynamic MSG
    {
        get
        {
            string obj = HttpContext.Current.Session["MSG"].ToString();
            return string.IsNullOrEmpty(obj) ? null : JsonConvert.DeserializeObject(obj);
        }
        set
        {
            if (value == null) throw new ArgumentNullException(nameof(value));
            HttpContext.Current.Session["MSG"] = JsonConvert.SerializeObject(value);
        }
    }

但是,_context是什么类型的?也许这个目标存在一些差异。