2012-08-16 16 views
9

ये समान प्रश्न हैं: How-to: Load a type from a referenced assembly at runtime using a string in Silverlight, GetType on a class in a referenced assembly fails लेकिन न तो जवाब काम करता है।वर्ग नाम को स्ट्रिंग के रूप में आपूर्ति करके संदर्भित असेंबली में टाइप प्राप्त करें?

मुझे एक एमवीसी प्रोजेक्ट मिला है जो डेटाबेस से डेटा खींचता है जिसमें सादे प्रकार स्ट्रिंग्स शामिल हैं। ये प्रकार एक संदर्भित असेंबली में हैं, एमवीसी परियोजना में नहीं।

इसलिए उदाहरण के लिए मान लीजिए कि मेरी संदर्भित विधानसभा नाम MyFramework है और सादे प्रकार का नाम Car, पूर्ण प्रकार का नाम MyFramework.Cars.Car या MyFramework.Vehicles.Cars.Car या कुछ अन्य भिन्नता हो सकता हैं। मेरे पास संदर्भित असेंबली नाम और सादा वर्ग का नाम स्ट्रिंग्स के रूप में है। पूर्ण प्रकार के नाम के बावजूद मैं प्रकार कैसे प्राप्त कर सकता हूं?

अंत में, क्या मैं संदर्भित असेंबली में एक फ़ंक्शन लिख सकता हूं जो GetType() को कॉल करता है और एमवीसी प्रोजेक्ट में इसका उपयोग करता है, इसलिए मैं असेंबली नाम सहित पूर्ववत कर सकता हूं? मैं विधानसभा नाम जानने निकालना चाहते हैं तो मैंने सोचा कि मैं की तरह संदर्भित विधानसभा में एक util लिख सकते हैं:

namespace MyFramework //the referenced assembly 
{ 
    public static class TypeUtil 
    { 
    public static Type GetFrameworkType(string typeName) 
    { 
     return Type.GetType(typeName); 
    } 
    } 
} 

और फिर मेरी MVC परियोजना में मैं एक स्ट्रिंग नाम के रूप में विधानसभा की जरूरत के बिना यह कह सकते हैं। क्या यह संभव है या क्या मुझे हमेशा असेंबली नाम की आवश्यकता होगी?

+0

अन्य उत्तरों क्यों काम नहीं करते? –

+0

@RobertHarvey ऐसा इसलिए है क्योंकि मेरे पास सिर्फ सादा वर्ग का नाम है। पूर्ण प्रकार का नाम नहीं है। वे जवाब पूर्ण प्रकार को जानने पर भरोसा करते हैं। – SventoryMang

उत्तर

19

शायद संदर्भित असेंबली उस समय लोड नहीं हुई है। साथ ही, मैं आपके प्रश्न से समझता हूं कि आपके पास पूर्ण प्रकार का नाम नहीं है, केवल कक्षा का नाम है।
फिर आप इस रेखा के साथ कुछ प्रयास करना चाहिए:

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName"); 

आशा मैं तुम्हें सही ढंग से समझा।

+0

यदि मैं उस असेंबली में उपयोग करता हूं लेकिन अभी भी केवल कक्षा का नाम है, तो यह कैसा लगेगा? मैं 'TypeUtil' कक्षा लिखकर असेंबली नाम की आवश्यकता को हटाना चाहता हूं जिसमें 'GetTypeFromFramework (string typeName)' फ़ंक्शन हो सकता है। मैंने सोचा कि अगर मैं उस असेंबली में 'गेट टाइप' कहता हूं, तो मुझे असेंबली का उपयोग करने की ज़रूरत नहीं है, लेकिन यह अभी भी शून्य हो जाती है। – SventoryMang

+0

कृपया जो भी आप करने का प्रयास कर रहे हैं उसका एक नमूना पोस्ट करें, ताकि हम आपकी स्थिति को बेहतर ढंग से समझ सकें। –

+0

मैंने सवाल संपादित किया। आपका उत्तर मेरे उपयोग में इसका उपयोग करते समय काम करता है। मैं सिर्फ उत्सुक हूं अगर मैं असेंबली नाम पर एक स्ट्रिंग के रूप में निर्भरता को हटा सकता हूं। मैं इस धारणा के तहत था कि अगर मैंने उस असेंबली में गेटटाइप() को बुलाया, तो मुझे असेंबली नाम की आपूर्ति करने की आवश्यकता नहीं होगी, लेकिन बस 'टाइप.गेट टाइप (क्लास नेम)' की आपूर्ति करना शून्य वापस लौटा रहा है, भले ही यह कोड था संदर्भित असेंबली। – SventoryMang

9

पहला सवाल के लिए, आप की तरह

Type t = AppDomain.CurrentDomain.GetAssemblies() 
           .Where(a => a.FullName == "MyFramework") 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.Name == "Car") 
           .FirstOrDefault(); 

कुछ मुझे यकीन है कि आप दूसरे प्रश्न से क्या मतलब है नहीं कर रहा हूँ कर सकता है।