我通过反射循环对象中的所有属性:
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)
答案 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...