2010-01-02 10 views
27

विभिन्न डेटाबेस तालिकाओं में मेरे पास एक संपत्ति और मूल्य कॉलम दोनों हैं। मैं डेटाबेस तक पहुंचने के लिए लिंक से SQL का उपयोग कर रहा हूं।मुझे अपने सी # जेनेरिक विधि में "त्रुटि: ... एक संदर्भ प्रकार होना चाहिए" क्यों मिलता है?

मैं एक तरीका है जिसके एक शब्दकोश दिया डेटाबेस तालिका से लिया गया गुण/मूल्यों से युक्त रिटर्न लिख रहा हूँ:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) 
{ 
    Dictionary<string, string> properties = new Dictionary<string, string>(); 

    foreach (var row in table) 
    { 
     properties[row.Property]=row.Value; 
    } 

    return properties; 
} 

संकलन करने पर, मैंने मिलती है:

Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table<TEntity>'

मैं कोशिश की है भाग्य के बिना इस त्रुटि संदेश की खोज।

स्टैक ओवरफ्लो खोजना, यह प्रश्न समान है, हालांकि पैरामीटर के संबंध में सूची: Generic List<T> as parameter on method - हालांकि पैरामीटर अभी भी उस प्रश्न के उत्तर में एक संदर्भ प्रकार नहीं है।

एमएसडीएन पर सी # प्रोग्रामिंग गाइड पढ़ना: http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx मैं उनके उदाहरणों को संदर्भ के अनुसार पैरामीटर पास करता हूं। हालांकि, मैं नहीं देख सकता कि मेरे विशेष मामले में संदर्भ से कैसे पास किया जाए, क्योंकि जेनेरिक प्रकार केवल जेनेरिक प्रकार की तालिका निर्दिष्ट करने के लिए है।

किसी भी पॉइंटर्स की बहुत सराहना की जाएगी।

पीएस: अगर मुझे यह सुविधा स्वीकार करने में समय लगता है, तो माफी माँगती है, क्योंकि यह सुविधा वर्तमान में पहुंच योग्य नहीं है (मैं अंधा हूं और स्क्रीन रीडर का उपयोग करता हूं)।

+0

कौन सा लाइन के खिलाफ है कि त्रुटि संदेश है? – sblom

+4

@ माहेश: क्या आपने अपनी पोस्ट की आखिरी पंक्ति पढ़ी? @ सकिब: आप उस बारे में स्टैक ओवरफ्लो लोगों को एक नोट आग लगाना चाहेंगे। मुझे यकीन है कि वे जानना चाहते हैं कि उनकी साइट की एक महत्वपूर्ण विशेषता टूट गई है और यह उनके आगंतुकों के एक महत्वपूर्ण खंड के लिए काम नहीं करती है। –

+1

क्षमा करें मेरा बुरा, मैंने नहीं किया। इंगित करने के लिए धन्यवाद। माफी –

उत्तर

59

इसका कारण यह है Table<T> कैसे घोषित किया जाता है की होता है:

public sealed class Table<TEntity> : IQueryable<TEntity>, 
    IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable, 
    IListSource 
where TEntity : class // <-- T must be a reference type! 

संकलक क्योंकि आपके विधि T बगैर किसी अड़चन है शिकायत कर रहा है, जिसे आप एक T जिनमें से विनिर्देश के अनुरूप नहीं है स्वीकार कर सकता है कि इसका मतलब है Table<T>

इस प्रकार, आपकी विधि को कम से कम सख्त होने की आवश्यकता है जो इसे स्वीकार करता है। ऐसा करें:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class 
21

बस अपनी विधि घोषणा में बाधा where T : class जोड़ें।

यह आवश्यक है क्योंकि Table<TEntity> में where TEntity : class बाधा है। अन्यथा आपकी जेनेरिक विधि को स्ट्रक्चर टाइप पैरामीटर के साथ बुलाया जा सकता है, जिसके लिए सीएलआर को उस संरचना प्रकार पैरामीटर के साथ Table<TEntity> को तत्काल करने की आवश्यकता होगी, जो Table<TEntity> पर बाधा का उल्लंघन करेगा।

0
public class TEntityRepository<TEntity> : EFRepository<TEntity> , ITEntityRepository<TEntity> 
    where TEntity : class, new() 
{ 
} 
संबंधित मुद्दे