कैसे करें Parameters को Activator.CreateInstance <T> () में पास करें


236

मैं उस प्रकार का एक उदाहरण बनाना चाहता हूं जिसे मैं एक सामान्य विधि में निर्दिष्ट करता हूं जो मेरे पास है। इस प्रकार के कई अतिभारित कंस्ट्रक्टर हैं। मैं कंस्ट्रक्टरों को तर्क पारित करने में सक्षम होना चाहता हूं, लेकिन

Activator.CreateInstance<T>()

यह एक विकल्प के रूप में है नहीं देखता है।

क्या इसे करने का एक और तरीका है?


जवाबों:



16

नामित पैरामीटर के माध्यम से CreateInstance में तर्क पास करने का एक और तरीका है।

उसके आधार पर, आप एक सरणी को पास कर सकते हैं CreateInstance। यह आपको 0 या एकाधिक तर्क देने की अनुमति देगा।

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}

2
यह अधूरा लगता है, निश्चित रूप से आपको शून्य के बजाय टाइप टी की एक वस्तु वापस करने की आवश्यकता है? public T CreateInstance <T> (params object [] paramArray) {return (T) Activator.CreateInstance (टाइपो (T), args: paramArray); }
1717

11

हालांकि ध्यान रखें कि Activator.CreateInstance पर पास होने वाले तर्कों में महत्वपूर्ण प्रदर्शन अंतर बनाम पैरामीटर रहित निर्माण है।

पूर्व संकलित लैम्ब्डा का उपयोग करके गतिशील रूप से ऑब्जेक्ट बनाने के लिए बेहतर विकल्प हैं। बेशक प्रदर्शन हमेशा व्यक्तिपरक होता है और यह स्पष्ट रूप से प्रत्येक मामले पर निर्भर करता है कि क्या यह इसके लायक है या नहीं।

इस आलेख पर समस्या के बारे में विवरण।

ग्राफ लेख से लिया गया है और प्रति 1000 कॉल पर एमएस में लगने वाले समय का प्रतिनिधित्व करता है।

प्रदर्शन की तुलना


संदर्भ के लिए, इस चार्ट का मतलब है कि (एक ही हार्डवेयर पर) औसतन, एक पैरामीटर वाले कंस्ट्रक्टर का प्रत्येक आह्वान (3.5 माइक्रोसेकंड) के साथ Activator.CreateInstanceहोगा 0.0035ms- आपके आवेदन के आधार पर यह प्रदर्शन-परीक्षणों में भी पंजीकृत नहीं हो सकता है।
दाई

6

Activator.CreateInstance के विकल्प के रूप में, लिंक किए गए url में FastObjectFactory Activator से बेहतर है (.NET 4.0 के रूप में और .NET 3.5 की तुलना में काफी बेहतर है। .NET 4.5 के साथ कोई परीक्षण / आंकड़े नहीं किए गए)। आँकड़े, जानकारी और कोड के लिए StackOverflow पोस्ट देखें:

Activator.CreateInstance में ctor args कैसे पास करें या IL का उपयोग करें?


क्या आपका मतलब है कि एक वैकल्पिक समाधान (जुड़ा हुआ) है, जो Activator.CreateInstance से बेहतर प्रदर्शन करने की संभावना है जब आप पैरामीटर पारित कर रहे हैं? या कि सभी मामलों में बेहतर प्रदर्शन की संभावना है?
एल जोर्को

1
मैंने थोड़ी देर में प्रदर्शन परीक्षण नहीं किया है और ऐसा लगता है कि किसी ने .NET 4.0 आँकड़े पोस्ट किए हैं, लेकिन हाँ .NET 4.0 के साथ ऐसा लगता है कि FastObjectFactory का प्रदर्शन बेहतर है। Activator.CreateInstance .NET 3.5 में भयानक था और .NET 4.0 में काफी तेज था, हालांकि अभी भी उस url में जुड़े FastObjectFactory की तुलना में धीमा है।
टेम्स

1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}

1
यह केवल अस्पष्टीकृत कोड है। मुझे संदेह है कि यह मदद करता है या यहां तक ​​कि बिल्कुल भी काम करता है। मुझे समझाने के लिए अन्यथा कृपया बताएं कि यह कैसे काम करता है और समस्या को हल करने के लिए क्यों माना जाता है।
युनानोस्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.