我正在.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();
}
}
答案 0 :(得分:2)
您的CreateObject<T>
方法将T
限制为具有无参数构造函数的类型(当然,不是抽象的)。因此,您不能将此方法与T
或Get<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);
}
}