टी

2009-11-12 26 views
20

के प्रकार को लागू करने के दौरान सामान्य प्रकार "टी के रूप में" कास्टिंग करना मुझे लगता है कि मुझे लगता है कि यह एक चाल है और मुझे विश्वास नहीं है कि मैंने पहले कभी नहीं किया है। हालांकि, मैं कीवर्ड के रूप में एक सामान्य प्रकार का उपयोग कैसे कर सकता हूं?टी

[Serializable] 
public abstract class SessionManager<T> where T : ISessionManager 
{ 

    protected SessionManager() { } 

    public static T GetInstance(HttpSessionState session) 
    { 

     // Ensure there is a session Id 
     if (UniqueId == null) 
     { 
      UniqueId = Guid.NewGuid().ToString(); 
     } 

     // Get the object from session 
     T manager = session[UniqueId] as T; 
     if (manager == null) 
     { 
      manager = Activator.CreateInstance<T>(); 
      session[UniqueId] = manager; 
     } 

     return manager; 

    } 

    protected static string UniqueId = null; 

} 

लाइन T manager = session[UniqueId] as T; निम्न त्रुटि फेंकता है:

The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint

अब, मुझे लगता है कि इस का कारण समझ में; मैंने भौतिक रूप से संकलक को नहीं बताया है कि टी एक वर्ग है। अगर मैं बदल देते हैं:

public abstract class SessionManager<T> where T : ISessionManager 

public abstract class SessionManager<T> where T : class 

साथ ... तो कोड सफलतापूर्वक बनाता है।

लेकिन मेरा प्रश्न इस प्रकार है; मैं सामान्य प्रकार पर कक्षा और ISessionManager प्रवर्तन दोनों कैसे हो सकता है? मुझे आशा है कि इसके लिए एक बहुत ही सरल जवाब है।

संपादित करें: बस जोड़ने के लिए मैं कोशिश की थी: where T : ISessionManager, class, पता चला है कि मैं अपने संकलक त्रुटि को ठीक से नहीं पढ़ी थी। बस पर्याप्त है, ISessionManager से पहले वर्ग डालने से समस्या ठीक हो जाती है। त्रुटि जो मैंने नहीं पढ़ी थी:

"The 'class' or 'struct' constraint must come before any other constraints".

गूंगा पल खत्म हो गया।

+2

BTW, आप उपयोग नहीं करना चाहिए। आपको 'नई()' बाधा जोड़नी चाहिए और कोड में 'नया टी() 'का उपयोग करना चाहिए। –

+0

कभी नहीं जानता था! धन्यवाद। – GenericTypeTea

उत्तर

37
... where T : class, ISessionManager 

मामले में आप उपयोग करना चाहते हैं जहां keyword यहाँ तरीकों पर एक उदाहरण है कि यह भी जेनरिक

public void store<T>(T value, String key) 
    { 
     Session[key] = value; 
    } 

    public T retrieve<T>(String key) where T:class 
    { 
     return Session[key] as T ; 
    } 
+0

आर **। मैं लिख रहा हूं जहां टी: ISessionManager, कक्षा! – GenericTypeTea

+7

जो मुझे संकलक त्रुटियों को ठीक से पढ़ने के लिए सिखाएगा। – GenericTypeTea

15
where T : class, ISessionManager 

आप आगे भी

where T : class, ISessionManager, new() 

इस वसीयत जा सकते हैं का उपयोग करता है टी

के रूप में सौंपने के लिए पैरामीटर रहित सीटीआर के साथ गैर अमूर्त वर्ग को मजबूर करें
4

Constraints on Type Parameters in C# पर पढ़ें।

इस विशेष मामले में, आप सुनिश्चित करना चाहिए कि टी एक वर्ग है: `` यहां CreateInstance

public abstract class SessionManager<T> 
    where T : class, ISessionManager 
+3

वह निर्माण नहीं करेगा। ;) कक्षा पहले आना है। इसके अलावा, किसी विशेष प्रकार के लिए सभी बाधाओं को एक ही खंड में निर्दिष्ट किया जाना चाहिए ... – GenericTypeTea

+0

आप सही हैं, मैं वाक्यविन्यास भूल गया, तय किया गया। अद्यतन करने के लिए –

+0

+1। – GenericTypeTea

संबंधित मुद्दे