आप में प्रकार पता नहीं है संकलन समय है, लेकिन आप वास्तविक प्रकार (यानी नहीं List<object>
) और आप उचित प्रकार पैरामीटर के साथ एक सामान्य विधि/प्रकार में नहीं कर रहे हैं चाहते हैं, तो आप प्रतिबिंब का उपयोग करना होगा।
प्रतिबिंब आसान बनाने के लिए , मैंने कभी-कभी अपने स्वयं के कोड में एक नया जेनेरिक प्रकार या विधि पेश की है, इसलिए मैं इसे प्रतिबिंब द्वारा कॉल कर सकता हूं लेकिन n उसके बाद सामान्य जेनेरिक का उपयोग करें। उदाहरण के लिए:
object x = GetObjectFromSomewhere();
// I want to create a List<?> containing the existing
// object, but strongly typed to the "right" type depending
// on the type of the value of x
MethodInfo method = GetType().GetMethod("BuildListHelper");
method = method.MakeGenericMethod(new Type[] { x.GetType() });
object list = method.Invoke(this, new object[] { x });
// Later
public IList<T> BuildListHelper<T>(T item)
{
List<T> list = new List<T>();
list.Add(item);
return list;
}
बेशक, आप सूची के साथ एक बहुत भयंकर बाद में यदि आप प्रकार ... यही कारण है कि बात यह है कि इस तरह की अक्सर नीचे गिर जाता है नहीं जानता नहीं कर सकते। हमेशा नहीं - मैंने कुछ मौकों पर उपरोक्त की तरह कुछ उपयोग किया है, जहां टाइप सिस्टम बस मुझे स्थिर रूप से आवश्यक सब कुछ व्यक्त करने की अनुमति नहीं देता है।
संपादित करें: ध्यान दें कि हालांकि मैं ऊपर दिए गए कोड में Type.GetMethod को कॉल कर रहा हूं, अगर आप इसे निष्पादित करने जा रहे थे तो शायद आप इसे केवल एक बार कॉल करना चाहते हैं - आखिरकार, विधि नहीं जा रही है बदलने के लिए। आप इसे स्थैतिक बना सकते हैं (आप उपरोक्त मामले में कर सकते हैं) और आप शायद इसे निजी बनाना चाहते हैं। मैंने इसे नमूना कोड में GetMethod कॉल की सादगी के लिए सार्वजनिक उदाहरण विधि के रूप में छोड़ा - आपको अन्यथा उचित बाध्यकारी झंडे निर्दिष्ट करने की आवश्यकता होगी।
स्रोत
2008-11-21 06:24:44
आप एक गैर-जेनेरिक IList (जो सूची <>) द्वारा समर्थित है, लौटा सकता है, तो लौटाई गई सूची का उपयोग किया जाएगा। – configurator
किस मामले में शुरुआत करने के लिए एक ArrayList का उपयोग करना आसान होगा। –
आह, लेकिन जब इसे आईएलिस्ट के रूप में डाला जाता है तो संग्रह में गलत प्रकार जोड़ना गलत प्रकार के बारे में अपवाद के माध्यम से होगा, है ना? – Sekhat