2008-11-24 3 views
34

Как я могу пройти через каждое из свойств в моем пользовательском объекте? Это не объект коллекции, но есть ли что-то подобное для объектов, не связанных с коллекцией?Как перебирать каждое свойство пользовательского объекта vb.net?

For Each entry as String in myObject 
    ' Do stuff here... 
Next 

В моем объекте есть строковые, целочисленные и булевы свойства.

ответ

59

Используя отражение, вы можете это сделать. В C# это выглядит так;

PropertyInfo[] propertyInfo = myobject.GetType().GetProperties(); 

Добавлен VB.Net перевод:

Dim info() As PropertyInfo = myobject.GetType().GetProperties() 
+0

Где значение внутри каждой записи? – Anders 2008-11-24 16:10:28

+0

Существует метод с именем propertyInfo.GetValue(). – 2008-11-25 10:43:06

1

Вы можете использовать отражение ... С отражением вы можете исследовать каждый член класса (тип), proeprties, методы, contructors, поля, и т.д ..

using System.Reflection; 

Type type = job.GetType(); 
    foreach (MemberInfo memInfo in type.GetMembers()) 
     if (memInfo is PropertyInfo) 
     { 
      // Do Something 
     } 
41

Вы можете использовать System.Reflection namespac e для запроса информации о типе объекта.

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)) 
    End If 
Next 

Обратите внимание, что этот подход не рекомендуется использовать вместо коллекций в вашем коде. Отражение - это интенсивная работа, и ее следует использовать с умом.

5

System.Reflection является "тяжеловес", я всегда осуществлять более легкий способ первый ..

// C#

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