Определите, является ли свойство универсальным List <of T> через Reflection и элементы списка циклов - PullRequest
8 голосов
/ 01 октября 2009

Я зацикливаю все свойства объекта с помощью отражения:

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 с .Net 2.0)

Ответы [ 4 ]

13 голосов
/ 01 октября 2009

Попробуйте это полное консольное приложение. Извините, это в 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();
        }


    }           
}
4 голосов
/ 01 октября 2009

Вот ответ 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
0 голосов
/ 30 июля 2015

Здесь вы идете в VB.NET. (Я использую .NET 4.5). Если ваш исходный объект List (из T) с переменной name = MyData, то

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

Выше код дает все свойства в списке MyData.

Перебирая свойства в главном списке (MyData) и выясняя, является ли какое-либо отдельное свойство типом списка, используйте ниже для цикла. Вы можете удалить проверку 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
0 голосов
/ 01 октября 2009
if p.PropertyType = TypeOf List(Of T) then...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...