2014-10-15 6 views
5

मुझे एक वस्तु मिली है जिसमें संपत्तियों का संग्रह है। जब मुझे विशिष्ट इकाई मिलती है तो मैं उस क्षेत्र को देख सकता हूं जिसे मैं ढूंढ रहा हूं (opportunityid) और यह Value विशेषता इस अवसर के लिए Guid है। यह वह मूल्य है जो मैं चाहता हूं, लेकिन यह हमेशा एक अवसर के लिए नहीं होगा, और इसलिए मैं हमेशा opportunityid पर नहीं देख सकता, इसलिए मुझे उपयोगकर्ता द्वारा प्रदान किए गए इनपुट के आधार पर फ़ील्ड प्राप्त करने की आवश्यकता है।आप PropertyInfo से किसी संपत्ति का मूल्य कैसे प्राप्त कर सकते हैं?

मेरे कोड अब तक है:

Guid attrGuid = new Guid(); 

BusinessEntityCollection members = CrmWebService.RetrieveMultiple(query); 

if (members.BusinessEntities.Length > 0) 
{ 
    try 
    { 
     dynamic attr = members.BusinessEntities[0]; 
     //Get collection of opportunity properties 
     System.Reflection.PropertyInfo[] Props = attr.GetType().GetProperties(); 
     System.Reflection.PropertyInfo info = Props.FirstOrDefault(x => x.Name == GuidAttributeName); 
     attrGuid = info.PropertyType.GUID; //doesn't work. 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("An error occurred when retrieving the value for " + attributeName + ". Error: " + ex.Message); 
    } 
} 

गतिशील attr, जो बारी में एक मूल्य के क्षेत्र है, जो सही Guid होता है (इस मामले opportunityid में) क्षेत्र मैं तलाश कर रहा हूँ में शामिल है। हालांकि, जब मुझे PropertyInfo जानकारी (opportunityid) प्राप्त होती है तो इसमें अब Value विशेषता नहीं है। मैंने PropertyType.GUID को देखने का प्रयास किया लेकिन यह सही Guid वापस नहीं लौटाता है। मैं इस संपत्ति के लिए मूल्य कैसे प्राप्त कर सकता हूं?

उत्तर

7

जब तक संपत्ति static है, किसी संपत्ति का मूल्य प्राप्त करने के लिए PropertyInfo ऑब्जेक्ट प्राप्त करने के लिए पर्याप्त नहीं है। जब आप "सादे" सी # लिख सकते हैं और आप कुछ संपत्ति के एक मूल्य मिलता है, कहते हैं, MyProperty करने की जरूरत है, तो आप इस बारे में:

var val = obj.MyProperty; 

आप दो चीजों की आपूर्ति - संपत्ति नाम (यानी क्या प्राप्त करने के लिए) और वस्तु (यानी इसे कहां से प्राप्त करें)।

PropertyInfo "क्या" का प्रतिनिधित्व करता है। आपको अलग से "कहां से" निर्दिष्ट करना होगा। जब आप

var val = info.GetValue(obj); 

फोन आप गुजरती हैं, "कहाँ से" PropertyInfo को दे यह आप के लिए वस्तु से संपत्ति के मूल्य निकालने के।

नोट:

var val = info.GetValue(obj, null); 
+0

अच्छा स्पष्टीकरण! GetValue() का दूसरा पैरामीटर है जो यद्यपि शून्य होना चाहिए। – helb

+0

मुझे जो चाहिए वह लगता है। यह सुनिश्चित करने के लिए कि मैं समझता हूं, बस इसका परीक्षण करने जा रहा हूं। – sr28

+0

हमम, मुझे यकीन है कि यह तरीका काम करेगा यदि मैं इसे समझ गया। हालांकि, मुझे एक अपवाद मिल रहा है कि यह CRMWebService.Key को System.Guid में परिवर्तित नहीं कर सकता है। मैंने मूल रूप से attrGuid = (Guid) जानकारी की है। GetValue (attr, null); – sr28

2

PropertyInfo.GetValue() का उपयोग करें। अपनी संपत्ति प्रकार Guid? मानते हुए है तो यह काम करना चाहिए:

attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value; 

ध्यान दें कि एक अपवाद है, तो संपत्ति के मूल्य शून्य है फेंक दिया जाएगा।

2

के साथ प्रयास करें:

attrGuid = (Guid)info.GetValue(attr,null) 
3

गुण का नाम बदल रहा है, तो आप GetValue उपयोग करना चाहिए:

info.GetValue(attr, null); 

कि विधि के अंतिम विशेषता null हो सकता है, क्योंकि यह सूचकांक है मान, और केवल Value[1,2] जैसे सरणी तक पहुंचने पर इसकी आवश्यकता होती है।

आप पहले से पर विशेषता का नाम जानते हैं, तो आप इसके बारे में dynamic व्यवहार इस्तेमाल कर सकते हैं: आप अपने आप को प्रतिबिंब करने का आवश्यकता के बिना संपत्ति कॉल कर सकते हैं:

var x = attr.Guid; 
+0

यह मेरे attr की Guid देना नहीं चाहेंगे: .NET 4.5 आपको एक दूसरा तर्क के रूप में अशक्त उत्तीर्ण करने की आवश्यकता से पहले?मेरे उदाहरण में एटीआर एक इकाई का प्रतिनिधित्व करता है, जिसके बदले में संपत्ति का मौका होता है, जिसके बदले में एक मूल्य (guid) होता है, तो क्या मुझे पहले अवसरहीन नामक संपत्ति प्राप्त करने की आवश्यकता नहीं है? – sr28

+0

आप जो चाहें उसके पीछे टाइप कर सकते हैं, जब तक कि यह एक मौजूदा संपत्ति है, क्योंकि यह वैसे भी JIT'ed है। –

+0

कृपया बताएं कि यह क्यों काम करना चाहिए – helb

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