2011-01-12 17 views
60

के रूप में टाइप करें मेरे पास प्रकारों (System.Type) की एक सूची है जिसे डेटाबेस पर पूछे जाने की आवश्यकता है।सी # सिस्टम का उपयोग करें। जेनेरिक पैरामीटर

इस प्रकारों में से प्रत्येक के लिए, मैं निम्नलिखित extensionmethod कॉल करने के लिए (जो LinqToNhibernate का हिस्सा है) की जरूरत है:

Session.Linq<MyType>() 

हालांकि मैं MyType की जरूरत नहीं है, लेकिन मैं बजाय एक प्रकार का उपयोग करना चाहते।

क्या मेरे पास है:

Session.Linq<typeOne>() 

कैसे मैं एक सामान्य पैरामीटर के रूप में एक प्रकार का उपयोग कर सकते हैं:

System.Type typeOne; 

लेकिन मैं निम्नलिखित प्रदर्शन नहीं कर सकते?

उत्तर

70

आप सीधे नहीं कर सकते हैं। जेनेरिक का बिंदु संकलन-समय टाइप सुरक्षा प्रदान करना है, जहां आप संकलित समय पर रुचि रखने वाले प्रकार को जानते हैं, और उस प्रकार के उदाहरणों के साथ काम कर सकते हैं। आपके मामले में, आपको केवल Type पता है, इसलिए आपको कोई संकलन-समय जांच नहीं मिल सकती है कि आपके पास मौजूद किसी भी वस्तु के उदाहरण हैं।

आप प्रतिबिंब के माध्यम से विधि कॉल करने की आवश्यकता होगी - कुछ इस तरह:

// Get the generic type definition 
MethodInfo method = typeof(Session).GetMethod("Linq", 
           BindingFlags.Public | BindingFlags.Static); 

// Build a method with the specific type argument you're interested in 
method = method.MakeGenericMethod(typeOne); 
// The "null" is because it's a static method 
method.Invoke(null, arguments); 

आप इस प्रकार के एक बहुत उपयोग करने की आवश्यकता है, तो आप इसे और अधिक सुविधाजनक अपनी खुद की सामान्य विधि है जो कहता है लिखने के लिए मिल सकती है जो भी अन्य सामान्य तरीकों की आवश्यकता है, और फिर प्रतिबिंब के साथ अपनी विधि पर कॉल करें।

+1

मैंने एक ऐसे समाधान के बारे में पढ़ा जो विधि को कॉल करने के लिए प्रतिबिंब का उपयोग करता है। लेकिन मुझे उम्मीद थी कि एक और समाधान था। – Jan

+2

@ यान नोप; यह –

+0

है invoke विधि "ऑब्जेक्ट" देता है। मैं इस ऑब्जेक्ट पर तब तक पूछने में सक्षम नहीं हूं जब तक कि मैं इसे सही प्रकार पर नहीं डालता। (जो शायद IQueryable होगा)। मैं ऑब्जेक्ट को मेरे प्रकार के प्रकार में कैसे डाल सकता हूं? – Jan

22

यह आप उपयोग करने की आवश्यकता करने के लिए प्रतिबिंब:

typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null); 

(यह सोचते हैं कि Linq<T>() प्रकार Session पर एक स्थिर तरीका है)

तो Session वास्तव में एक वस्तु है, तो आप की आवश्यकता होगी यह जानने के लिए कि Linq विधि वास्तव में घोषित की गई है, और Session में एक तर्क के रूप में पास करें:

typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) 
    .Invoke(null, new object[] {Session}); 
संबंधित मुद्दे