2017-06-03 18 views
0

我在.net核心中创建了一个web应用程序,我试图创建一个通用的方式来设置并从Session获取“对象”。设置和获取我可以做的部分,我唯一的问题是,如果对象不存在,我想要初始化该对象。我得到的错误是'T'必须是一个带有公共无参数构造函数的非抽象类型,才能在通用类型或方法'SessionExtensions.CreateObject()'中使用它作为参数'T'有人可以帮助我吗? 感谢提前:) PS:这里是我的代码:在.Net Core中创建对象类型T

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

编译器是相当清楚的,你可以使用一个类型,是一个抽象类,接口或类里面没有你的'设置参数的构造函数3210'或'获取'方法,因为这些方法不会将'T'限制为'new()',而'CreateObjects'。你能更清楚你在问什么? –

+0

嗨,谢谢你的评论,那么如果你用这种通用的方式来创建对象,你有什么建议呢? :) –

+0

是否有*特定*的原因,你需要创建一个新的对象,如果它不存在于会话中?那么在构造函数中带有参数的复杂类型呢?为什么你不能从调用代码中处理丢失的键? –

回答

2

CreateObject<T>方法限制T与参数的构造函数(当然的,不是抽象的)类型。出于这个原因,您不能在限制较少的T(如Get<T>Set<T>)中使用此方法。

要么添加new()约束到您的Get<T>方法或不使用CreateObject<T>并从Get<T>方法,该方法将返回null引用类型和值类型的默认值返回default(T)

在您的场景中,我认为在会话字典中缺少密钥时不需要返回新对象,因此更合理的方法是返回该类型的默认值,并处理缓存未命中来电显示:

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); 
    } 
} 

调用代码:

var obj = session.Get<MyClass>("myKey") ?? new MyClass(); 
+0

谢谢@Frederico Dipuma,这真是我一直在寻找的。感谢您的帮助 :) –