2009-10-01 5 views
8

Je boucle toutes les propriétés d'un objet par réflexion:Déterminer si la propriété est Liste générique <of T> par des éléments de réflexion et de liste de boucle

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

Quelqu'un peut-il me dire comment déterminer si la propriété en question est un liste générique (Of T)? Si c'est le cas, je dois boucler la liste elle-même.

J'ai expérimenté avec GetType et TypeOf mais je n'ai pas réussi à faire fonctionner quelque chose.

Merci.

**** Mise à jour et la clarification **

Pour clarifier les choses, je veux garder ce générique. Je ne veux pas spécifier le type de T, je dois boucler les éléments de la liste et appeler la méthode ToString sur chaque élément. T pourrait être l'un d'un certain nombre de types différents (types de référence spécifiques à l'application). Est-il possible de le faire sans spécifier les types?

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

Répondre

4

Voici Roatins réponse VB.Net, Application complète Console

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, est-ce pas illégal de faire sur stackoverflow ?? –

+1

Juste essayer d'aider le gars. J'ai utilisé converter.telerik.com – Ryu

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

Correction: Si TypeOf p.PropertyType est List (Of T) Alors ... – Simon

13

Essayez cette application console complète. Désolé c'est en 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

Ici, vous allez en VB.NET. (J'utilise .NET 4.5). Si votre objet est d'origine Liste (T) avec le nom variable = MyData, puis

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

code ci-dessus donne toutes les propriétés à l'intérieur MyData Liste.

Parcourir les propriétés de la liste principale (MyData) et rechercher si une seule propriété est elle-même un type de liste, utilisez ci-dessous pour la boucle. Vous pouvez supprimer IsGenericType vérifier s'il n'est pas nécessaire en fonction de vos besoins.

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 
Questions connexes