2009-02-10 15 views
146

मेरे पास एक कक्षा है।कक्षा के सभी गुणों के माध्यम से कैसे लूप करें?

Public Class Foo 
    Private _Name As String 
    Public Property Name() As String 
     Get 
      Return _Name 
     End Get 
     Set(ByVal value As String) 
      _Name = value 
     End Set 
    End Property 

    Private _Age As String 
    Public Property Age() As String 
     Get 
      Return _Age 
     End Get 
     Set(ByVal value As String) 
      _Age = value 
     End Set 
    End Property 

    Private _ContactNumber As String 
    Public Property ContactNumber() As String 
     Get 
      Return _ContactNumber 
     End Get 
     Set(ByVal value As String) 
      _ContactNumber = value 
     End Set 
    End Property 


End Class 

मैं उपरोक्त वर्ग के गुणों के माध्यम से लूप करना चाहता हूं। उदाहरण के लिए;

Public Sub DisplayAll(ByVal Someobject As Foo) 
    For Each _Property As something In Someobject.Properties 
     Console.WriteLine(_Property.Name & "=" & _Property.value) 
    Next 
End Sub 

उत्तर

264

उपयोग चिंतन:

Type type = obj.GetType(); 
PropertyInfo[] properties = type.GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 
    Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null)); 
} 

संपादित करें: आप भी type.GetProperties() करने के लिए एक BindingFlags मान निर्दिष्ट कर सकते हैं:

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; 
PropertyInfo[] properties = type.GetProperties(flags); 

कि सार्वजनिक दृष्टांत गुण को लौट गुण को प्रतिबंधित करेगा (छोड़कर स्थिर गुणों , संरक्षित गुण, आदि)।

आपको BindingFlags.GetProperty निर्दिष्ट करने की आवश्यकता नहीं है, तो आप उस संपत्ति का मूल्य प्राप्त करने के लिए type.InvokeMember() पर कॉल करते समय उपयोग करते हैं।

+0

Btw, वहाँ कि GetProperties विधि के लिए कुछ बाध्यकारी झंडे नहीं होना चाहिए? 'बाइंडिंगफ्लैग्स | पब्लिक | बाइंडिंगफ्लैग्स.गेटप्रोपर्टी 'या कुछ? – Svish

+0

@ स्विस, आप सही हैं :) यह कुछ बाइंडिंगफ्लैग का उपयोग कर सकता है, लेकिन वे वैकल्पिक हैं। आप शायद सार्वजनिक चाहते हैं | उदाहरण। – Brannon

+0

युक्ति: यदि आप स्थिर फ़ील्ड से निपट रहे हैं, तो बस यहां शून्य पास करें: property.GetValue (शून्य); – Seva

28

सी Brannon द्वारा दिए गए # की वीबी संस्करण:

Public Sub DisplayAll(ByVal Someobject As Foo) 
    Dim _type As Type = Someobject.GetType() 
    Dim properties() As PropertyInfo = _type.GetProperties() 'line 3 
    For Each _property As PropertyInfo In properties 
     Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing)) 
    Next 
End Sub 

लाइन no.3 के बजाय

Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance 
    Dim properties() As PropertyInfo = _type.GetProperties(flags) 
+0

धन्यवाद, यह मुझे वीबी में बदलने के लिए बहुत लंबा समय लेगा :) – Brannon

+0

आप हमेशा एक स्वचालित कनवर्टर का उपयोग कर सकते हैं, वेब में बहुत सारे हैं :) – balexandre

+1

हां लेकिन हाथ कोडिंग जितना अच्छा नहीं है। एक उल्लेखनीय एक टेलरिक कोड कनवर्टर –

38

नोट में बाध्यकारी झंडे का प्रयोग उस वस्तु के बारे में आप बात कर रहे हैं कोई कस्टम गुण मॉडल है, तो (जैसे DataRowView आदि DataTable के लिए), तो आपको TypeDescriptor का उपयोग करने की आवश्यकता है; यह भी स्वरूपण के लिए TypeConverter तरह बातें करने के लिए आसान पहुँच प्रदान करता है

foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) { 
    Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj)); 
} 

: अच्छी खबर यह है कि यह अभी भी नियमित रूप से कक्षाओं के लिए ठीक काम करता है (और यहां तक ​​much quicker than reflection हो सकता है) है

string fmt = prop.Converter.ConvertToString(prop.GetValue(obj)); 
6

प्रतिबिंब सुंदर है " भारी "

शायद इस समाधान का प्रयास करें: // सी #

if (item is IEnumerable) { 
    foreach (object o in item as IEnumerable) { 
      //do function 
    } 
} else { 
    foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties())  { 
     if (p.CanRead) { 
      Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, null)); //possible function 
     } 
    } 
} 

'VB.Net

If TypeOf item Is IEnumerable Then 

    For Each o As Object In TryCast(item, IEnumerable) 
       'Do Function 
    Next 
    Else 
    For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties() 
     If p.CanRead Then 
       Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing)) 'possible function 
      End If 
     Next 
    End If 

प्रतिबिंब को धीमा कर देती +/- 1000 x एक विधि कॉल की गति, The Performance of Everyday Things

1
private void ResetAllProperties() 
    { 
     Type type = this.GetType(); 
     PropertyInfo[] properties = (from c in type.GetProperties() 
            where c.Name.StartsWith("Doc") 
            select c).ToArray(); 
     foreach (PropertyInfo item in properties) 
     { 
      if (item.PropertyType.FullName == "System.String") 
       item.SetValue(this, "", null); 
     } 
    } 

में दिखाया गया है मैं ऊपर कोड ब्लॉक उपयोग किए गए सभी स्ट्रिंग गुण रीसेट करने के लिए मेरे वेब उपयोगकर्ता नियंत्रण ऑब्जेक्ट में नाम "डॉक" के साथ शुरू किए गए हैं।

0

यहाँ एक और तरीका यह करने के लिए है, एक LINQ लैम्ब्डा का उपयोग कर:

सी #:

SomeObject.GetType().GetProperties().ToList().ForEach(x => Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, null)}")); 

VB.NET:

SomeObject.GetType.GetProperties.ToList.ForEach(Sub(x) Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, Nothing)}")) 
1

यह कैसे मैं यह कर रहा है।

foreach (var fi in typeof(CustomRoles).GetFields()) 
{ 
    var propertyName = fi.Name; 
} 
संबंधित मुद्दे