2017-06-03 17 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,這真是我一直在尋找的。感謝您的幫助 :) –