2009-10-09 6 views
52

अगर मैंका उपयोग GetProperties() BindingFlags.DeclaredOnly साथ

sometype.GetProperties(); 

का उपयोग मैं प्रकार से सभी गुणों की हो और उसे अपने जनक है। हालांकि मैं केवल इस प्रकार (माता-पिता नहीं) में स्पष्ट रूप से परिभाषित गुणों को पुनर्प्राप्त करना चाहता हूं। मैंने सोचा कि BindingFlags.DeclaredOnly विकल्प क्या था।

हालांकि, जब मैं यह कोशिश:

sometype.GetProperties(BindingFlags.DeclaredOnly); 

मैं 0 गुण मिलता है।

कोई भी जानता है कि मैं क्या गलत कर रहा हूं?

+11

'सभी के लिए कि Google से आते हैं:' आप अभी भी अपने "properties" निशानी लगाने के बाद भी नहीं मिल सकता है, अगर आप ' सी # के लिए नया नया और 'गुण' और 'फ़ील्ड्स 'के बीच का अंतर नहीं पता,' GetFields() 'का उपयोग करने का प्रयास करें। आप शायद 'फ़ील्ड' की तलाश कर रहे हैं! – user1306322

+0

@ user1306322: सिर्फ रिकार्ड के लिए, मैं "गूगल से आते हैं" और मेरे कोड है: 'वर प्रकार = type.GetFields.Select (च => f.FieldType) .Union (type.GetProperties.Select (पी => पी .PropertyType)); '- और परिणाम अभी भी गिनती 0. – Veverke

उत्तर

73

आप किसी भी BindingFlags निर्दिष्ट करते हैं, तो आप स्पष्ट रूप से क्या गुण आप प्राप्त करना चाहते हैं निर्दिष्ट करने की आवश्यकता है। उदाहरण के लिए:

sometype.GetProperties (BindingFlags.DeclaredOnly | 
         BindingFlags.Public | 
         BindingFlags.Instance); 
43

संक्षेप में:

  1. अगर आप GetProperties() अधिभार (पैरामीटर के बिना) का उपयोग करें, आप सभी सार्वजनिक गुण मिल जाएगा।

      :

    • दूसरी ओर

      , यदि आप GetProperties(BindingFlags) अधिभार (जिनमें एक BindingFlags पैरामीटर स्वीकार करता है) का उपयोग करें, तो आप निम्न झंडे के प्रत्येक समूह से एक बिटवाइज़ या कम से कम एक का निर्दिष्ट करने की आवश्यकता

    • BindingFlags.Instance/BindingFlags.Static (उदाहरण के स्थिर गुणों बनाम),
    • BindingFlags.Public/BindingFlags.NonPublic (बनाम गैर सरकारी संपत्तियों सार्वजनिक)।

उदाहरण के लिए, सार्वजनिक स्थैतिक गुण प्राप्त करने के, आप परिणाम प्राप्त करने के GetProperties(BindingFlags.Public | BindingFlags.Static) कॉल करने के लिए की आवश्यकता होगी। केवल GetProperties(BindingFlags.Public) या GetProperties(BindingFlags.Static) पर कॉल करने से कोई परिणाम नहीं आएगा।

यह भी ध्यान दें कि BindingFlags.Default निर्दिष्ट करने से खाली सरणी वापस आ जाएगी।

पूर्ण विवरण MSDN documentation for GetProperties(BindingFlags) में पाया जा सकता:

निम्नलिखित BindingFlags फिल्टर झंडे जो नेस्ट प्रकार खोज में शामिल करने के लिए परिभाषित करने के लिए इस्तेमाल किया जा सकता:

  • आप या तो निर्दिष्ट करना होगा वापसी पाने के लिए BindingFlags.Instance या BindingFlags.Static
  • खोज में सार्वजनिक गुणों को शामिल करने के लिए BindingFlags.Public निर्दिष्ट करें।
  • खोज में BindingFlags.NonPublic निर्दिष्ट करने के लिए गैर सार्वजनिक विधियों (यानी, निजी, आंतरिक, और संरक्षित तरीकों) को शामिल करने के लिए निर्दिष्ट करें। आधार वर्गों पर केवल संरक्षित और आंतरिक तरीकों को वापस कर दिया जाता है; आधार वर्गों पर निजी तरीकों को वापस नहीं किया जाता है।
  • BindingFlags.FlattenHierarchy निर्दिष्ट करें ताकि सार्वजनिक और संरक्षित स्थैतिक सदस्यों को पदानुक्रम में शामिल किया जा सके; विरासत कक्षाओं में निजी स्थैतिक सदस्यों को शामिल नहीं किया गया है।

    • BindingFlags.DeclaredOnly केवल गुण प्रकार पर घोषित, गुण है कि बस विरासत में मिले नहीं खोज करने के लिए:

    निम्नलिखित BindingFlags संशोधक झंडे को बदलने के लिए इस्तेमाल किया जा सकता है कि कैसे खोज काम करता है।

+0

तो इसे इंगित करने के लिए: * बिना * किसी बाध्यकारीफ्लैग के, कुछ डिफ़ॉल्ट हैं। क्या आप जानते हैं कि वे कौन हैं? –

+1

यदि आप 'GetProperties()' अधिभार (पैरामीटर के बिना) का उपयोग करते हैं, तो आपको सभी सार्वजनिक गुण मिलेंगे। लेकिन 'GetProperties (BindingFlags.Default)' एक खाली सरणी वापस कर देगा। – Groo

+0

हे, तो बाइंडिंगफ्लैग्स का उपयोग क्या है। डीफॉल्ट ?! ;) – UpTheCreek

15

आप अपने BindingsFlag थोड़ा विस्तार करने के लिए की जरूरत है। कुछ भी सार्थक वापस पाने के लिए उन्हें कम से कम एक्सेसिबिलिटी स्तर और आवृत्ति बनाम स्थैतिक शामिल करने की आवश्यकता है।

मुझे लगता है कि क्या आप वास्तव में देख रहे निम्नलिखित

var flags = BindingFlags.DeclaredOnly 
    | BindingFlags.Instance 
    | BindingFlags.Public; 
someType.GetProperties(flags); 
0

MSDN साइट से।

डिफ़ॉल्ट (सदस्य) कोई बाध्यकारी ध्वज निर्दिष्ट करता है।

आप सार्वजनिक या Nonpublic या कोई सदस्य नहीं लौटा दी जाएगी साथ उदाहरण या साथ स्टेटिक निर्दिष्ट करना होगा।

इसलिए जब तक कि आप बाध्यकारी झंडे निर्दिष्ट नहीं करते हैं, आपको कुछ भी नहीं मिलता है।

-1

मैं typeof(Thing) का उपयोग कर समस्या नहीं थी, अंत में यह मेरे लिए काम किया:

 var thisThing = (new Thing()).GetType(); 
     foreach (var property in thisThing.GetProperties()) 
     { 
      // ... 
     } 
संबंधित मुद्दे