2008-11-11 15 views
11

मैं एक वर्ग ReportingComponent<T> है, जो निर्माता के आधार पर:बनाएं जेनेरिक कक्षा उदाहरण बेनामी प्रकार

public ReportingComponent(IQueryable<T> query) {} 

मैं करेंनॉर्थविंडडेटाबेस के खिलाफ LINQ क्वेरी,

var query = context.Order_Details.Select(a => new 
{ 
    a.OrderID, 
    a.Product.ProductName, 
    a.Order.OrderDate 
}); 

क्वेरी प्रकार IQueryable<a'> की है , जहां एक 'अज्ञात प्रकार है।

मैं एक नया उदाहरण बनाने के लिए ReportingComponent को क्वेरी पास करना चाहता हूं।

ऐसा करने का सबसे अच्छा तरीका क्या है?

दयालु संबंध।

उत्तर

16

एक सामान्य विधि लिखें और प्रकार अनुमान का उपयोग करें।

public static class ReportingComponent 
{ 
    public static ReportingComponent<T> CreateInstance<T> (IQueryable<T> query) 
    { 
    return new ReportingComponent<T>(query); 
    } 
} 

फिर अपने अन्य कोड में आप कॉल कर सकते हैं:

var report = ReportingComponent.CreateInstance(query); 

संपादित करें: कारण है कि हम मैं अक्सर यह अच्छी तरह से काम करता है अगर आप सामान्य से एक के रूप में एक ही नाम के साथ एक स्थिर nongeneric वर्ग बनाने लगता है एक गैर-सामान्य प्रकार की आवश्यकता है कि प्रकार अनुमान केवल जेनेरिक विधियों के लिए होता है - यानी एक विधि जो एक नया प्रकार पैरामीटर पेश करती है। हम इसे सामान्य प्रकार में नहीं डाल सकते हैं, क्योंकि हमें अभी भी विधि को कॉल करने के लिए जेनेरिक प्रकार निर्दिष्ट करने में सक्षम होना चाहिए, जो पूरे बिंदु को हरा देता है :)

मेरे पास blog post है जो इसमें जाता है अधिक जानकारी।

+0

संकलन करने की कोशिश करने पर मुझे त्रुटि मिलती है: टाइप या नेमस्पेस नाम 'टी' नहीं मिला (क्या आप एक निर्देश या निर्देशक संदर्भ का उपयोग कर रहे हैं?) ऐसा लगता है कि यह अभी भी टी के प्रकार का अनुमान नहीं लगा सकता है :( –

+1

धन्यवाद जेरेड। ट्रेन स्टेशन के चरणों पर कोड लिखने में यह समस्या है :) –

+0

एक प्रश्न, हमें गैर-सामान्य वर्ग की आवश्यकता क्यों है? यह सामान्य वर्ग के साथ क्यों काम नहीं करता है? प्रकार अनुमान अभी भी काम करना चाहिए। –

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