代码之家  ›  专栏  ›  技术社区  ›  Simon

通过反射和循环列表项确定属性是否为generic list<of t>

  •  8
  • Simon  · 技术社区  · 15 年前

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

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

    有人能告诉我如何确定所讨论的属性是否是(t的)通用列表吗?如果是,我需要循环列表本身。

    我尝试过gettype和typeof,但没有成功地使任何东西工作。

    谢谢。

    ****更新和澄清**

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

    (vb.net 2005和.net 2.0)

    4 回复  |  直到 9 年前
        1
  •  4
  •   Ryu    15 年前

    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
  •  13
  •   Roatin Marth    15 年前

    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();
            }
    
    
        }           
    }
    
        3
  •  0
  •   Venkat    9 年前

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

    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
    
        4
  •  -1
  •   Preet Sangha    15 年前
    if p.PropertyType = TypeOf List(Of T) then...