C# 在.NETCore中创建类型为T的对象
我正在.NETCore中创建一个web应用程序,并尝试创建一种通用方法来设置和获取会话中的“对象”。设置和获取我能做的部分,我唯一的问题是,如果会话中不存在对象,我想初始化它。我得到的错误是,“T”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“SessionExtensions.CreateObject()中用作参数“T” 有人能帮我吗? 提前感谢:) PS:这是我的代码:C# 在.NETCore中创建类型为T的对象,c#,.net,asp.net-core,C#,.net,Asp.net Core,我正在.NETCore中创建一个web应用程序,并尝试创建一种通用方法来设置和获取会话中的“对象”。设置和获取我能做的部分,我唯一的问题是,如果会话中不存在对象,我想初始化它。我得到的错误是,“T”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“SessionExtensions.CreateObject()中用作参数“T” 有人能帮我吗? 提前感谢:) PS:这是我的代码: public static class SessionExtensions { public s
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();
}
}
公共静态类SessionExtensions
{
公共静态无效集(此ISession会话,字符串键,T值)
{
SetString(key,JsonConvert.SerializeObject(value));
}
公共静态T Get(此ISession会话,字符串键)
{
var值=session.GetString(键);
返回值==null?CreateObject():
JsonConvert.DeserializeObject(值);
}
公共静态T CreateObject(),其中T:new()
{
返回新的T();
}
}
您的CreateObject
方法将T
限制为具有无参数构造函数(当然不是抽象)的类型。因此,您不能将此方法与Get
或Set
中限制较少的T
一起使用
向Get
方法添加new()
约束,或者不使用CreateObject
并从Get
方法返回default(T)
,对于引用类型,该方法将返回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);
}
}
公共静态类SessionExtensions
{
公共静态无效集(此ISession会话,字符串键,T值)
{
SetString(key,JsonConvert.SerializeObject(value));
}
公共静态T Get(此ISession会话,字符串键)
{
var值=session.GetString(键);
返回值==null?默认值(T):
JsonConvert.DeserializeObject(值);
}
}
呼叫代码:
var obj = session.Get<MyClass>("myKey") ?? new MyClass();
var obj=session.Get(“myKey”)??新MyClass();
您的CreateObject
方法将T
限制为具有无参数构造函数(当然不是抽象)的类型。因此,您不能将此方法与Get
或Set
中限制较少的T
一起使用
向Get
方法添加new()
约束,或者不使用CreateObject
并从Get
方法返回default(T)
,对于引用类型,该方法将返回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);
}
}
公共静态类SessionExtensions
{
公共静态无效集(此ISession会话,字符串键,T值)
{
SetString(key,JsonConvert.SerializeObject(value));
}
公共静态T Get(此ISession会话,字符串键)
{
var值=session.GetString(键);
返回值==null?默认值(T):
JsonConvert.DeserializeObject(值);
}
}
呼叫代码:
var obj = session.Get<MyClass>("myKey") ?? new MyClass();
var obj=session.Get(“myKey”)??新MyClass();
编译器非常清楚,您可以使用一个类型,它是一个抽象类、一个接口或一个在集合
或Get
方法中没有无参数构造函数的类,因为这些方法不像new()
那样限制T
,而CreateObjects
则是这样做的。你能更清楚地说明你在问什么吗?嗨,谢谢你的评论,那么如果对象以这种通用方式为null,你有什么建议来创建该对象呢?:)如果会话中不存在新对象,您需要创建它的具体原因是什么?那么构造函数中包含参数的复杂类型呢?为什么您不能处理调用代码中缺少的键呢?编译器很清楚,您可以使用一个类型,它是一个抽象类、一个接口或一个在Set
或Get
方法中没有无参数构造函数的类,因为这些方法不限制t
作为new()
,而CreateObjects
会。你能更清楚地说明你在问什么吗?嗨,谢谢你的评论,那么如果对象以这种通用方式为null,你有什么建议来创建该对象呢?:)如果会话中不存在新对象,您需要创建它的具体原因是什么?那么构造函数中包含参数的复杂类型呢?为什么你不能处理掉通话密码中丢失的钥匙?谢谢你@Frederico Dipuma,这真是我要找的。谢谢你的帮助:)谢谢你@Frederico Dipuma,这真是我要找的。谢谢你的帮助:)