通过Reflection和循环列表项确定属性是否为通用List <of T>

Sim*_*mon 8 vb.net generics reflection

我通过反射循环对象中的所有属性:

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

任何人都可以告诉我如何确定有问题的属性是否是通用列表(Of T)?如果是,我需要循环列表本身.

我已经尝试过GetType和TypeOf,但还没有设法让任何工作.

谢谢.

****更新和澄清**

为了澄清,我想保持这种通用性.我不想指定T的类型,我需要循环列表项并在每个项上调用ToString方法.T可以是许多不同类型之一(特定于应用程序的引用类型).是否可以在不指定类型的情况下执行此操作?

(VB.NET 2005 with .Net 2.0)

Roa*_*rth 13

试试这个完整的控制台应用 对不起,这是在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();
        }


    }           
}
Run Code Online (Sandbox Code Playgroud)


Ryu*_*Ryu 5

这是 Roatins 在 VB.Net 中的答案,完整的控制台应用程序

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
Run Code Online (Sandbox Code Playgroud)