在.Net Core

时间:2017-06-03 00:07:56

标签: c# .net asp.net-core

我正在.net核心中创建一个Web应用程序,我正在尝试创建一种通用的方法来设置和获取Session中的“对象”。设置和获取的部分我可以做,我唯一的问题是我想初始化对象,如果它在会话中不存在。我得到的错误是'T'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法'SessionExtensions.CreateObject()中将其用作参数'T' 有人能帮我吗? 谢谢你提前:) PS:这是我的代码:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? CreateObject<T>() :
                              JsonConvert.DeserializeObject<T>(value);
    }

    public static T CreateObject<T>() where T : new()
    {
        return new T();
    }
}

1 个答案:

答案 0 :(得分:2)

您的CreateObject<T>方法将T限制为具有无参数构造函数的类型(当然,不是抽象的)。因此,您不能将此方法与TGet<T>中的限制较少 Set<T>一起使用。

向您的new()方法添加Get<T>约束,或者不使用CreateObject<T>并从default(T)方法返回Get<T>,这将返回{{1}对于引用类型和值类型的默认值。

在你的场景中,我认为在会话字典中缺少密钥时根本不需要返回新对象,返回该类型的默认值并处理 cache-miss 来自来电者:

null

致电代码:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? default(T) :
                              JsonConvert.DeserializeObject<T>(value);
    }
}