2011-09-27 6 views
24
public class TestClass 
{ 
     public string property1 { get; set; } 
     public string property2 { get; set; } 

     internal string property3 { get; set; } 
     internal string property4 { get; set; } 
     internal string property5 { get; set; } 
} 

में आंतरिक गुणों के माध्यम से कैसे पुन: प्रयास कर सकता हूं, मैं निम्नलिखित लूप के साथ गुणों के माध्यम से पुन: प्रयास कर सकता हूं, लेकिन यह केवल सार्वजनिक गुण दिखाता है। मुझे सभी गुणों की आवश्यकता है।मैं C#

foreach (PropertyInfo property in typeof(TestClass).GetProperties()) 
{ 
    //do something 
} 
+0

भी देखें http://stackoverflow.com/questions/16024006/how-do-i-look-up-the-internal-properties इसके लिए एक संस्करण के लिए -एक-एसी-तेज-श्रेणी-संरक्षित-रक्षा। – nawfal

उत्तर

48

आप निर्दिष्ट करने के लिए है कि आप बस सार्वजनिक संपत्तियों की जरूरत नहीं है की जरूरत है, overload का उपयोग कर स्वीकार करने BindingFlags:

foreach (PropertyInfo property in typeof(TestClass) 
      .GetProperties(BindingFlags.Instance | 
          BindingFlags.NonPublic | 
          BindingFlags.Public)) 
{ 
    //do something 
} 

यदि आप स्थिर गुणों को शामिल करना चाहते हैं तो BindingFlags.Static जोड़ें।

पैरामीटर रहित अधिभार केवल सार्वजनिक गुणों को लौटाता है।

+7

गैर-सार्वजनिक और इंस्टेंस देना प्रोप 1 और प्रोप 2 को छुपाएगा, आपको दोनों को गैर-गणराज्य की आवश्यकता है। सभी गुणों के लिए सार्वजनिक –

+0

वैसे भी केवल संरक्षित या आंतरिक का चयन करने के लिए? –

+0

@NevilleNazerane: बाध्यकारी झंडे के साथ नहीं, जो मुझे पता है। बस बाद में फ़िल्टर करें। –

10

आप करने के लिए अपने फोन पर BindingFlags बदलने की जरूरत है Type.GetProperties

प्रयास करें:

var instanceProperties = typeof(TestClass).GetProperties(
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Instance 
); 
foreach(var instanceProperty in instanceProperties) { 
    // a little something something for the instanceProperty 
} 
+0

हाँ, मुझे BindingFlags.Public को भी जोड़ना था – gangt

3

उपयोग BindingFlags

foreach (PropertyInfo property in typeof(TestClass) 
     .GetProperties(
      BindingFlags.Public | 
      BindingFlags.NonPublic | 
      BindingFlags.Instance)) 
{ 
    //do something 
} 
3

को निर्दिष्ट क्या GetProperties में BindingFlags द्वारा:

foreach (PropertyInfo property in typeof(TestClass).GetProperties(
     BindingFlags.Instance| 
     BindingFlags.Public| 
     BindingFlags.NonPublic)) 
3

MSDN, निजी और आंतरिक के अनुसार प्रतिबिंब एपीआई में मान्यता प्राप्त नहीं हैं।

प्रतिबिंब का उपयोग करके एक आंतरिक विधि की पहचान करने के लिए, IsAssembly संपत्ति का उपयोग करें। संरक्षित आंतरिक विधि की पहचान करने के लिए, IsFamilyOrAssembly का उपयोग करें।

आप कुछ परीक्षण इकाइयों लिख रहे हैं, तो आप InternalsVisibleTo विशेषता पर एक नज़र लेने के लिए चाहते हो सकता है। यह आपको यह निर्दिष्ट करने की अनुमति देता है कि कौन सी असेंबली आंतरिक गुण देख सकती है।

और अंत में, आप वास्तव में आंतरिक गुण होते हैं की जरूरत है ...

+0

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