2008-08-27 15 views
6

मैं .NET CF 3.5 का उपयोग कर रहा हूं। जिस प्रकार का मैं बनाना चाहता हूं उसके पास डिफॉल्ट कन्स्ट्रक्टर नहीं है, इसलिए मैं स्ट्रिंग को ओवरलोडेड कन्स्ट्रक्टर में पास करना चाहता हूं। मैं यह कैसे करु?कॉम्पैक्ट फ्रेमवर्क - मैं गतिशील रूप से कोई डिफ़ॉल्ट कन्स्ट्रक्टर के साथ प्रकार कैसे बना सकता हूं?

कोड:

Assembly a = Assembly.LoadFrom("my.dll"); 
Type t = a.GetType("type info here"); 
// All ok so far, assembly loads and I can get my type 

string s = "Pass me to the constructor of Type t"; 
MyObj o = Activator.CreateInstance(t); // throws MissMethodException 

उत्तर

9
MyObj o = null; 
Assembly a = Assembly.LoadFrom("my.dll"); 
Type t = a.GetType("type info here"); 

ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(string) }); 
if(ctor != null) 
    o = ctor.Invoke(new object[] { s }); 
0

(untested) देखने के लिए कि यह आपके लिए काम करता है: आप को खोजने के लिए कुछ फैंसी फुटवर्क करना पड़ सकता है प्रकार तो एक से अधिक निर्माता है

Type t = a.GetType("type info here"); 
var ctors = t.GetConstructors(); 
string s = "Pass me to the ctor of t"; 
MyObj o = ctors[0].Invoke(new[] { s }) as MyObj; 

हैं वह जो आपके स्ट्रिंग पैरामीटर को स्वीकार करता है।

संपादित करें: बस कोड का परीक्षण किया गया है, और यह काम करता है।

संपादित 2: Chris' answer उस फैंसी फुटवर्क को दिखाता है जिसके बारे में मैं बात कर रहा था! ;-)

4

@ जोनाथन क्योंकि कॉम्पैक्ट फ्रेमवर्क जितना संभव हो उतना पतला होना चाहिए। अगर कुछ करने का कोई दूसरा तरीका है (जैसे कोड मैंने पोस्ट किया है) तो वे आम तौर पर कार्यक्षमता को डुप्लिकेट नहीं करते हैं।

रोरी ब्लीथ ने कॉम्पैक्ट फ्रेमवर्क को "सिस्टम के चारों ओर एक रैपर" के रूप में वर्णित किया है। नॉटइम्प्लेटेडएक्सेटियन "। :)

1

ठीक है, यहाँ आप एक प्रकार सक्रिय करने के लिए एक सुविधाजनक तरीका प्रदान करने के लिए एक फैशनेबल सहायक विधि मानकों की एक सरणी दिया है:

static object GetInstanceFromParameters(Assembly a, string typeName, params object[] pars) 
{ 
    var t = a.GetType(typeName); 

    var c = t.GetConstructor(pars.Select(p => p.GetType()).ToArray()); 
    if (c == null) return null; 

    return c.Invoke(pars); 
} 

और आप इसे इस तरह कहते हैं:

Foo f = GetInstanceFromParameters(a, "SmartDeviceProject1.Foo", "hello", 17) as Foo; 

तो आप पहले दो पैरामीटर के रूप में असेंबली और प्रकार के नाम को पास करते हैं, और फिर सभी कन्स्ट्रक्टर के पैरामीटर क्रम में।

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

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