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