2009-10-01 5 views
8

Ich Looping alle Eigenschaften in einem Objekt durch Reflexion:fest, ob Eigenschaft generische Liste <of T> über Reflexion und Schleife Listenelement ist

For Each p As PropertyInfo In values.[GetType]().GetProperties() 
    If p.CanRead Then 
     'Do stuff 
    End If 
Next 

Kann mir jemand sagen, wie Sie feststellen, ob die Eigenschaft in Frage a generische Liste (Of T)? Wenn es ist, muss ich die Liste selbst loopen.

Ich habe mit GetType und TypeOf experimentiert, aber es ist mir nicht gelungen, etwas zum Laufen zu bringen.

Danke.

**** Update und Klarstellung **

Um zu klären, ich diese generisch halten wollen. Ich möchte den Typ von T nicht angeben, ich muss die Listenelemente in einer Schleife ausführen und die ToString-Methode für jedes Element aufrufen. T könnte einer von mehreren verschiedenen Typen sein (anwendungsspezifische Referenztypen). Ist es möglich, dies ohne Angabe von Typen zu tun?

(VB.NET 2005 mit .Net 2,0)

Antwort

4

Hier ist Roatins Antwort in VB.Net, die komplette Konsole-Anwendung

Imports System 
Imports System.Reflection 
Imports System.Collections.Generic 
Imports System.Collections 

Namespace ReflectionTest 
    Public Class Object1 
     Public Overloads Overrides Function ToString() As String 
      Return "This is Object 1" 
     End Function 
    End Class 
    Public Class Object2 
     Public Overloads Overrides Function ToString() As String 
      Return "This is Object 2" 
     End Function 
    End Class 

    Public Class ContainerClass 
     Public Property objects() As List(Of Object) 
      Get 
      End Get 
      Set 
      End Set 
     End Property 
     Public Property propA() As Integer 
      Get 
      End Get 
      Set 
      End Set 
     End Property 
     Public Property propB() As String 
      Get 
      End Get 
      Set 
      End Set 
     End Property 
     Public Property propC() As String() 
      Get 
      End Get 
      Set 
      End Set 
     End Property 
    End Class 
    Class Program 
     Shared Sub Main(args As String()) 
      ' Sample class instance 
      Dim c As New ContainerClass() 

      ' Add some sample data 
      c.objects = New List(Of Object)() 
      c.objects.Add(New Object1()) 
      c.objects.Add(New Object2()) 

      Dim props As PropertyInfo() = c.[GetType]().GetProperties() 

      For Each p As PropertyInfo In props 
       If GetType(IList).IsAssignableFrom(p.PropertyType) AndAlso p.PropertyType.IsGenericType Then 
        Dim item As IList = DirectCast(p.GetValue(c, Nothing), IList) 
        If item <> Nothing Then 
         For Each o As Object In item 
          Console.WriteLine(o.ToString()) 
         Next 
        End If 
       End If 
      Next 
      Console.ReadLine() 
     End Sub 


    End Class 
End Namespace 
+0

Uhhh, ist das nicht illegal auf Stackoverflow zu tun ?? –

+1

Ich versuche nur, dem Kerl zu helfen. Ich habe converter.telerik.com benutzt – Ryu

-1
if p.PropertyType = TypeOf List(Of T) then... 
+0

Korrektur: Wenn TypeOf p.PropertyType Ist List (Of T) Then ... – Simon

13

Versuchen Sie, diese komplette Konsolenanwendung. Tut mir leid, es ist in C#.

using System; 
using System.Reflection; 
using System.Collections.Generic; 
using System.Collections; 

namespace ReflectionTest 
{ 
    public class Object1 
    { 
     public override string ToString() 
     { 
      return "This is Object 1"; 
     } 
    } 
    public class Object2 
    { 
     public override string ToString() 
     { 
      return "This is Object 2"; 
     } 
    }  

    public class ContainerClass 
    { 
     public List<object> objects { get; set; } 
     public int propA { get; set; } 
     public string propB { get; set; } 
     public string[] propC { get; set; } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Sample class instance 
      ContainerClass c = new ContainerClass(); 

      // Add some sample data 
      c.objects = new List<object>(); 
      c.objects.Add(new Object1()); 
      c.objects.Add(new Object2()); 

      PropertyInfo[] props = c.GetType().GetProperties(); 

      foreach (PropertyInfo p in props) 
      { 
       if (typeof(IList).IsAssignableFrom(p.PropertyType) 
        && p.PropertyType.IsGenericType) 
       { 
        IList item = (IList)p.GetValue(c, null); 
        if (item != null) 
        { 
         foreach (object o in item) 
         { 
          Console.WriteLine(o.ToString()); 
         } 
        } 
       } 
      } 
      Console.ReadLine(); 
     } 


    }   
} 
0

Hier können Sie in VB.NET gehen. (Ich benutze .NET 4.5). Wenn Ihre ursprüngliche Objekt ist List (T) mit variabler name = MyData, dann

Dim CurCols() as PropertyInfo = MyData.GetType.GetGenericArguments()(0).GetProperties 

Above Code gibt alle Eigenschaften innerhalb MyData Liste.

Wenn Sie die Eigenschaften in der Hauptliste (MyData) durchlaufen und herausfinden möchten, ob eine einzelne Eigenschaft selbst ein Listentyp ist, verwenden Sie unten for loop. Sie können die IsGenericType-Prüfung entfernen, wenn dies aufgrund Ihrer Anforderung nicht erforderlich ist.

For Each iCol In CurCols 
    Dim colType as Type = iCol.PropertyType 
    If colType.IsGenericType AndAlso colType.GetGenericTypeDefinition = GetType(List(Of)) Then 
     MsgBox(iCol.Name.ToString & " Is a List Type.") 
    End If 
Next 
Verwandte Themen