2009-02-17 16 views
27

क्या GetType() से लौटे गए प्रकार पर ऑब्जेक्ट डालना संभव है? मुझे एक सामान्य विधि चाहिए जो किसी ऑब्जेक्ट को (अनाम प्रकारों के लिए) स्वीकार कर सकती है लेकिन फिर ऑब्जेक्ट को अज्ञात प्रकार के रूप में वापस कर दें। मैं एक कंटेनर वर्ग पर एक विधि बनाने के लिए एलसीजी डायनेमिक मोड का उपयोग करने के बारे में सोच रहा हूं, लेकिन मैं बिल्कुल यह नहीं समझ सकता कि यह कैसा दिखता है। GetType() विधि के साथ डालने का विचार अनाम प्रकार प्राप्त करने में सक्षम होना था और वास्तव में प्रकार को जानने के बिना किसी ऑब्जेक्ट को अपने वास्तविक प्रकार पर डालना था।GetType के साथ कास्ट करें()

व्यापक लक्ष्य है कि मैं तो साझा करने और तरीकों के बीच पारित कर सकता है, एक कंटेनर में गुमनाम टाइप वस्तुओं रहना है।

+0

के रूप में चर प्रकार के रूप में अच्छी तरह से सही होने के लिए की जरूरत नहीं होगी मैं, आपके उपयोग के मामले के बारे में यहाँ उत्सुक हूँ, और गतिशील टाइपिंग संभव नहीं है। – Ray

+0

मैं एक सामान्य विधि अनुमान लगा रहा हूँ? –

+0

यह एक बहुत पुराना है। मैं मूल रूप से एक स्टोरेज तंत्र के रूप में अज्ञात प्रकारों का उपयोग कर सी # में ट्यूटोरियल डी भाषा को कार्यान्वित करने की सोच रहा था। एक बुरा विचार बन गया। गतिशील इसे बदल सकता है, लेकिन अब से मैंने परियोजना पर छोड़ दिया है ... अभी के लिए। –

उत्तर

13

आपका इरादा बहुत अस्पष्ट है; हालांकि, एक विकल्प सामान्य रूप से जेनेरिक और MakeGenericMethod है। आप इसके साथ क्या करना चाहते हैं? उदाहरण के लिए:

static class Program 
{ 
    static void Main() 
    { 
     object obj = 123.45; 
     typeof(Program).GetMethod("DoSomething") 
      .MakeGenericMethod(obj.GetType()) 
      .Invoke(null, new object[] { obj }); 
    } 
    public static void DoSomething<T>(T value) 
    { 
     T item = value; // well... now what? 
    }  
} 
तो अब हम मूल्य, जेनरिक के माध्यम से double के रूप में आपके द्वारा लिखा गया है

- लेकिन अभी भी बहुत हम अन्य सामान्य तरीकों बुला के अलावा इसके साथ क्या कर सकते हैं नहीं है ... क्या वह तुम थे यहाँ करना चाहते हैं?

35

मैं नहीं सोच सकता कि आप GetType() के रूप में क्यों डालना चाहते हैं, क्योंकि आप परिणाम के साथ उपयोगी कुछ भी करने में सक्षम नहीं होंगे, बिना किसी संकलन समय के प्रकार को जानने के।

शायद आप जो खोज रहे हैं, वह कनवर्ट करने में सक्षम है। अगर ऐसा है, तो निम्नलिखित बातें आप के लिए काम करना चाहिए:

object input = GetSomeInput(); 
object result = Convert.ChangeType(input, someOtherObject.GetType()); 

हम इसका उपयोग जब रजिस्ट्री जो सभी तारों के रूप में जमा हो जाती है से मूल्यों को पढ़ने, और फिर उन्हें प्रतिबिंब का उपयोग गुण में भरने।

+2

नोट: GetSomeInput() द्वारा लौटाए गए प्रकार को IConvertible (शीर्ष नीचे के साथ) लागू करना होगा। मुझे लगता है कि आंतरिक .NET CLR प्रकार सभी करते हैं। ;) –

+1

मैंने जवाब बदल दिए। हालांकि रूपांतरण उपयोगी है, यह एक वस्तु देता है। वास्तव में जो आवश्यक था वह वास्तविक प्रकार लौटा था। –

+0

यहां एक वैध उपयोग केस है: किसी कॉल से किसी तृतीय पक्ष लाइब्रेरी में हमें एक विधि का नाम, एक PropertyInfo और एक मान मिलता है जो हमेशा एक डबल होता है। चूंकि कई विधियों के पैरामीटर पूर्णांक हैं, इसलिए हमारा एप्लिकेशन क्रैश हो रहा था। इस कोड के साथ हम किसी भी मुद्दे के बिना प्राप्त डबल को ParameterInfo.ParameterType में परिवर्तित कर सकते हैं। धन्यवाद! :) –

4

आप एक प्रकार से एक उदाहरण बनाने के लिए Activator.CreateInstance विधि का उपयोग कर सकते हैं।

FYI करें प्रतिबिंब SLOOWWWW है, इसलिए यदि आप इस एक पंक्ति में कई बार डाली क्या करने की जरूरत है, यह प्रतिबिंब का उपयोग किए बिना एक enum या इस तरह तो बनाने के उदाहरणों कुछ में अपने प्रकार को परिभाषित करने के लिए बेहतर हो सकता है।

+0

और आप प्रतिबिंब के बिना enum में संग्रहीत प्रकारों से उदाहरण कैसे बनाते हैं? – jayarjo

+0

सी # एनम्स प्रकारों को स्टोर नहीं करते हैं, विशिष्ट enum एक प्रकार है, उस enum के प्रत्येक तत्कालता एक मूल्य है। यदि आप एक प्रकार का निर्माण करने के लिए एक enum का उपयोग करना चाहते हैं तो आपको केवल अपने कारखाने और हार्ड कोड को अपने प्रकार के नए बनाने के लिए उपयोग करना चाहिए। – Spence

-3

आप getClass() जो देता है एक कक्षा वस्तु तो क्लास वस्तु में डाली विधि का उपयोग करें, कि कक्षा के प्रकार का ऑब्जेक्ट को वस्तु कास्ट करने के लिए तो जैसे उपयोग कर सकते हैं:। (

myObj.getClass) डाली (myObj)

+1

वह जावा नहीं है # – George

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