2011-02-02 16 views
11

मैं किसी ऑब्जेक्ट के गुणों को कैसे पढ़ सकता हूं जिसमें सी # में प्रतिबिंब का उपयोग करके सरणी प्रकार का तत्व शामिल है। अगर मेरे पास GetMyProperties नामक एक विधि है और मैं यह निर्धारित करता हूं कि ऑब्जेक्ट एक कस्टम प्रकार है तो मैं किसी सरणी के गुणों और मूल्यों को कैसे पढ़ सकता हूं। IsCustomType यह निर्धारित करने का तरीका है कि प्रकार कस्टम प्रकार है या नहीं।प्रतिबिंब का उपयोग किसी अन्य ऑब्जेक्ट की सरणी वाले किसी ऑब्जेक्ट के गुणों को पढ़ने के लिए

public void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
     if (!Helper.IsCustomType(pinfo.PropertyType)) 
     { 
      string s = pinfo.GetValue(obj, null).ToString(); 
      propArray.Add(s); 
     } 
     else 
     { 
      object o = pinfo.GetValue(obj, null); 
      GetMyProperties(o); 
     } 
    } 
} 

परिदृश्य है, मैं ArrayClass का एक उद्देश्य है और ArrayClass दो गुण है:

-string Id 
-DeptArray[] depts 

DeptArray 2 गुणों के साथ एक और वर्ग है:

-string code 
-string value 

तो, यह तरीकों हो जाता है ArrayClass का एक वस्तु। मैं सभी गुणों को शीर्ष-से-नीचे और स्टोर नाम/मूल्य जोड़ी को एक शब्दकोश/सूची आइटम में पढ़ना चाहता हूं। मैं मूल्य, कस्टम, enum प्रकार के लिए यह करने में सक्षम हूँ। मैं वस्तुओं की सरणी के साथ फंस गया। सुनिश्चित नहीं है कि यह कैसे करें।

+0

हाय, मैं आपके कोड से नहीं देख रहा हूं जिसे आप प्राप्त करने की कोशिश कर रहे हैं। कोड संकलित नहीं होगा, क्योंकि pInfo.GetValue एक ऑब्जेक्ट देता है, स्ट्रिंग नहीं। – Adam

+0

इसके बारे में क्षमा करें। मैंने PInfo.GetValue() में ToString() जोड़ने के लिए कोड संपादित किया है। मुझे यह विधि बनाना था। मूल रूप से विधि में कुछ जटिल तर्क हैं। सरल बनाने के लिए, मुझे सभी गुणों, संपत्ति की संपत्ति और उनके मूल्य को पढ़ने की आवश्यकता है। –

उत्तर

15

इस कोड का प्रयास करें:

public static void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
    var getMethod = pinfo.GetGetMethod(); 
    if (getMethod.ReturnType.IsArray) 
    { 
     var arrayObject = getMethod.Invoke(obj, null); 
     foreach (object element in (Array) arrayObject) 
     { 
     foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties()) 
     { 
      Console.WriteLine(arrayObjPinfo.Name + ":" + arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString()); 
     } 
     } 
    } 
    } 
} 

मैं इस कोड परीक्षण किया है और इसे सही ढंग प्रतिबिंब के माध्यम से सरणियों हल करता है।

+0

@evgk, मैं स्पष्ट रूप से DeptArray को नहीं डाल सकता। मैं रनटाइम पर टाइप निर्धारित करता हूं। विधि पैरामीटर "obj" में कोई वर्ग वस्तु हो सकती है। मुझे इसके तत्व के माध्यम से सरणी जांचने और पुनरावृत्त करने के लिए एक सामान्य विधि की आवश्यकता है। –

+0

या, कोई समस्या नहीं है, मैंने जवाब संशोधित किया है। अब यह पास ऑब्जेक्ट में सभी सरणी प्राप्त करेगा और प्रत्येक सरणी तत्व और इसके गुणों के बिना अन्वेषण के कास्टिंग किए बिना पुन: सक्रिय होगा। यदि आप चाहें तो आप इस विधि को रिकर्सिव भी बना सकते हैं। – EvgK

+0

@Evgk, शानदार! यह सही है - धन्यवाद, मैं विभिन्न ऑब्जेक्ट गुणों के साथ तर्क का परीक्षण करूंगा ताकि यह देखने के लिए कि यह कहीं विफल हो गया है या नहीं। जब आप रिकर्सिव कहते हैं, तो यह जांचना है कि किसी सरणी के गुणों में सरणी है या नहीं ?? –

0

आपको संपत्ति मूल्य वस्तु पुनर्प्राप्त करने की आवश्यकता होगी और फिर उस पर GetType() को कॉल करें। तो फिर तुम कुछ इस तरह कर सकते हैं:

var type = pinfo.GetGetMethod().Invoke(obj, new object[0]).GetType(); 
if (type.IsArray) 
{ 
    Array a = (Array)obj; 
    foreach (object arrayVal in a) 
    { 
     // reflect on arrayVal now 
     var elementType = arrayVal.GetType(); 
    } 
} 

FYI करें - मैं एक पुनरावर्ती वस्तु स्वरूपण विधि (मैं अब इसके लिए JSON क्रमबद्धता का प्रयोग करेंगे) से इस कोड को खींच लिया।

+0

नहीं, मेरा मतलब GetGetMethod है। आप GetSetMethod क्यों कॉल करेंगे? क्या आप संपत्ति को पढ़ने की कोशिश नहीं कर रहे हैं और यदि यह तत्वों पर DeptArray पुनरावृत्त की सरणी है और उन्हें पढ़ा है? – JohnOpincar

+0

मैं इस प्रश्न का उत्तर देने का प्रयास कर रहा हूं "मैं उस ऑब्जेक्ट के गुणों को कैसे पढ़ सकता हूं जिसमें सी # में प्रतिबिंब का उपयोग करके सरणी प्रकार का तत्व शामिल है।" यदि यह सवाल नहीं है, तो आपको इसे संपादित करना चाहिए। – JohnOpincar

+0

जॉन, आप बिल्कुल सही हैं कि मुझे संपत्ति को पढ़ने और DeptArray पर पुन: प्रयास करने की आवश्यकता है। जब मैं कोड का यह टुकड़ा चलाता हूं। मुझे ऐरे ए = (ऐरे) obj पर कास्टिंग त्रुटि मिलती है। यह कहता है कि ऐरेक्लेस कैनोट को ऐरे में डाला जा सकता है। क्या आपको लगता है कि मुझे कुछ बताने के लिए याद आया? –

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