2010-03-22 9 views
5

के आधार पर IList पर ऑब्जेक्ट कास्ट करें। मैं थोड़ा प्रतिबिंब आज़मा रहा हूं और इस बात पर एक सवाल है कि परिणामस्वरूप ऑलिस्ट को ऑब्जेक्ट कैसे डाला जाता है। सी # - टाइप

यहाँ प्रतिबिंब है:

private void LoadBars(Type barType) 
{ 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    object obj = method.Invoke(foo, new object[] { /* arguments here */ }); 
    // how can we cast obj to an IList<Type> - barType 
} 

हम कैसे barType तर्क से प्रकार का एक IList को method.Invoke का परिणाम डाली कर सकते हैं?

उत्तर

5

एक कलाकार का बिंदु आम तौर पर संकलक को बताने के लिए होता है कि आपके पास कुछ अतिरिक्त जानकारी है - कि आप संकलन समय पर कुछ जानते हैं। आप यहां उस जानकारी को नहीं जानते - आपको केवल निष्पादन समय पर पता है।

इसे कास्ट करने के बाद मूल्य के साथ आप क्या करने की उम्मीद करेंगे? माना जाता है कि कुछ बार उपयोगी होंगे - जब आपको एक सामान्य इंटरफ़ेस का उपयोग करना होगा, भले ही आप उन सदस्यों को प्राप्त करना चाहते हैं जिन्हें टाइप पैरामीटर की आवश्यकता नहीं है (उदा। CountIList<T> में)। हालांकि, अगर आप ऐसा करने की कोशिश नहीं कर रहे हैं तो यह वास्तव में मदद करेगा यदि आप अधिक जानकारी दे सकते हैं।

+0

हम सूची को अपने कास्ट प्रकार के रूप में पुन: सक्रिय करना चाहते हैं। जो मैं मानता हूं वह कोई समझ नहीं लेता है, हमें इसे आवश्यक बनाने के लिए संकलक को प्रकार को बताने की आवश्यकता है। सवाल का लक्ष्य एक एज केस का पता लगाने के लिए था जो वास्तव में एक LOB अनियमितता के आसपास एक हैक है। मेरे लिए इस मुद्दे को स्पष्ट रूप से प्रस्तुत करने के लिए धन्यवाद। – blu

0

.NET 4.0 में आप अभिव्यक्ति के पेड़ों का उपयोग करके इसे प्राप्त कर सकते हैं।

0
private void LoadBars<T>() 
{ 
    Type barType = typeof(T); 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    IList<T> obj = (IList<T>)method.Invoke(foo, new object[] { /* arguments here */ }); 
} 
+1

बिल्कुल, लेकिन अब टी को संकलन समय पर जाना जाना है। – Radu094

0

कास्टिंग केवल मतलब होता अगर अपने नए barType समारोह संकलन समय पर की फोन करने वाले, और नहीं एक क्रम। और एक बार यह सच होने पर, आप केवल फ़ंक्शन को टेम्पलेट कर सकते हैं:

private IList<T> LoadBars<T>() 
{ 
... 
return obj as IList<T>; 
} 
4

मैंने अभी इस समस्या के साथ कुश्ती समाप्त कर ली है।
सच है, आप वस्तु को जेनेरिक IList में नहीं डाल सकते हैं लेकिन आप इसे सूची ऑब्जेक्ट की "ToArray" विधि का आह्वान करके दृढ़ता से टाइप किए गए ऐरे में परिवर्तित कर सकते हैं।

समाधान किसी अन्य ब्लॉग से लिया गया। http://amazedsaint.blogspot.com/2008/04/creating-generic-list-at-runtime.html

ToArrayMethod = obj.GetType()। GetMethod ("ToArray");

सिस्टम.एरे दृढ़ता से टाइप करेंअरे = = System.Array) ToArrayMethod.Invoke (obj, null);

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