2012-06-05 18 views
5

मैं एक गतिशील उद्देश्य यह है कि इस प्रकार दिखता है:डायनामिक ऑब्जेक्ट - यह बताएं कि कोई संपत्ति परिभाषित की गई है या नहीं?

this.ChartDetails.Chart 

'चार्ट' गतिशील है। मैं देखना चाहता हूं कि वामएक्सिस नाम चार्ट पर एक गतिशील संपत्ति मौजूद है या नहीं। गतिशील वस्तुओं पर ऐसा करने का सबसे अच्छा तरीका क्या है?

मुझे नहीं लगता कि यह How to detect if a property exists on an ExpandoObject? का डुप्लिकेट है क्योंकि यह गतिशील वस्तुओं के लिए ऐसा करने के लिए सबसे अच्छी विधि पर चर्चा नहीं करता है।

+0

this.ChartDetails.Chart.LeftYAxis अगर! = अशक्त –

+0

यह है * DynamicObject के अपने * कार्यान्वयन है? – Tigran

+3

संभावित डुप्लिकेट [सी # में गतिशील ऑब्जेक्ट पर कोई संपत्ति मौजूद है या नहीं? (Http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-a - गतिशील-ऑब्जेक्ट-इन-सी) – jason

उत्तर

6
bool isDefined = false; 
object axis = null; 
try 
{ 
    axis = this.ChartDetails.Chart.LeftYAxis; 
    isDefined = true; 
} 
catch(RuntimeBinderException) 
{ } 

यह पहली बार रनटाइम पर होता है। (यदि आप एक संपत्ति का उपयोग करते हैं 'गतिशील' बातों का टुकड़ा केवल तब होता है जब एक प्रथम मौका अपवाद DynamicObject के TryGetMember और TrySetMember

कुछ वस्तुओं की वस्तु की ओवरराइड द्वारा नियंत्रित किया जाता है (जैसे ExpandoObject) वास्तव में हुड के नीचे शब्दकोशों हैं

bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart) 
    .ContainsKey("LeftYAxis"); 

असल: जानते हुए भी क्या वास्तविक प्रकार ChartDetails.Chart है वहाँ के अलावा कोई रास्ता नहीं है (अगर यह एक ExpandoObject एक सादे ol 'object के उपवर्ग या DynamicObject का एक उपवर्ग है) के बिना और आप उन्हें सीधे इस प्रकार की जांच कर सकते ऊपर कोशिश/पकड़ो। यदि आपने ChartDetails और Chart के लिए कोड लिखा है या स्रोत कोड तक पहुंच है तो आप यह निर्धारित कर सकते हैं कि ऑब्जेक्ट के लिए कौन सी विधियां मौजूद हैं और जांचने के लिए उनका उपयोग करें।

5

कई कारणों से नियंत्रण प्रवाह के लिए प्रयास/पकड़ ब्लॉक से बचने के लिए सबसे अच्छा कारण है। इसलिए, जबकि क्रिस्टोफर की विधि वांछित परिणाम प्राप्त कर लेता है, मैं इस बेहतर लगता है:

this.ChartDetails.Chart.GetType().GetProperty("LeftYAxis") != null; 
-1

यह एक काम कर रहा है -:

public static bool IsPropertyExists(dynamic dynamicObj, string property) 
     { 
      try 
      { 
       var value=dynamicObj[property].Value; 
       return true; 
      } 
      catch (RuntimeBinderException) 
      { 

       return false; 
      } 

     } 
1

यह काम करता है अगर गतिशील वस्तु एक json/मुक्त मानक प्रारूप है।

मैंने दो अलग-अलग विधि सहायक एक खुले मानक प्रारूप के लिए और एक "मानक वस्तु" के लिए बनाया है।

// Checks if object typed json or xml has a specific property 
    public static bool IsPropertyExistsOpenStandardFormat(dynamic dynamicObject, string propertyName) 
    { 
     try 
     { 
      var x = dynamicObject[propertyName]; 
      if (x != null) 
       return true; 
     } 
     catch 
     { 
      return false; 
     } 

    } 

    // Checks if standard object has a specific property 
    public static bool IsPropertyExistsStandard(dynamic dynamicObject, string propertyName) 
    { 
     return dynamicObject.GetType().GetProperty(propertyName) != null; 
    } 
संबंधित मुद्दे