C# 在.NETCore中创建类型为T的对象

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

我正在.NETCore中创建一个web应用程序,并尝试创建一种通用方法来设置和获取会话中的“对象”。设置和获取我能做的部分,我唯一的问题是,如果会话中不存在对象,我想初始化它。我得到的错误是,“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();
    }
}
公共静态类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,这真是我要找的。谢谢你的帮助:)