通过Reflection和循环列表项</of>确定属性是否为通用List <of t =“”>

时间:2009-10-01 13:29:48

标签: vb.net generics reflection

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

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

有谁能告诉我如何确定有问题的财产是否是通用名单(Of T)?如果是,我需要循环列表本身。

我已经尝试过GetType和TypeOf,但还没有成功。

感谢。

****更新和澄清**

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

(VB.NET 2005 with .Net 2.0)

4 个答案:

答案 0 :(得分: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();
        }


    }           
}

答案 1 :(得分:4)

这是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

答案 2 :(得分:0)

这里你进入VB.NET。 (我使用.NET 4.5)。 如果原始对象是List(of T),变量name = MyData,则

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

上面的代码给出了MyData List中的所有属性。

循环遍历主列表(MyData)中的属性,并想要查找是否有任何单个属性本身是列表类型,请使用下面的for循环。如果不需要,您可以根据您的要求删除IsGenericType检查。

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

答案 3 :(得分:-1)

if p.PropertyType = TypeOf List(Of T) then...