0

如何使用反射获取基类属性和字段,以便我可以一次将类层次结构向上一层?目标是构建一个树形显示,显示具有任何类实例的值的属性和字段,就像调试器 Locals 窗口一样。我需要延迟加载每个基本实例的能力,以便在展开“基本”树节点时,可以按需显示那些具有值的属性和字段。

4

1 回答 1

2

这是一个简单的示例,可以执行您指定的操作。我相信您可以根据您的特定需求进行修改,或者至少它会为您指明正确的方向。

您可以将此示例复制并粘贴到控制台应用程序中,并设置一些断点以查看其工作原理。

VB.Net 中的代码

Module Module1

    Private Class ClassOne
        Private _One As String
        Private _Two As Integer
        Private _three As Double

        Public Property One() As String
            Get
                Return _One
            End Get
            Set(ByVal value As String)
                _One = value
            End Set
        End Property

        Public Property Two() As Integer
            Get
                Return _Two
            End Get
            Set(ByVal value As Integer)
                _Two = value
            End Set
        End Property

        Public Property Three() As Double
            Get
                Return _three
            End Get
            Set(ByVal value As Double)
                _three = value
            End Set
        End Property
    End Class

    Private Class ClassAlpha
        Inherits ClassOne

        Private _Alpha As String
        Private _Beta As Long

        Public Property Alpha() As String
            Get
                Return _Alpha
            End Get
            Set(ByVal value As String)
                _Alpha = value
            End Set
        End Property

        Public Property Beta() As Long
            Get
                Return _Beta
            End Get
            Set(ByVal value As Long)
                _Beta = value
            End Set
        End Property
    End Class

    Private Class ClassColor
        Inherits ClassAlpha

        Private _Red As String
        Private _Blue As Long

        Public Property Red() As String
            Get
                Return _Red
            End Get
            Set(ByVal value As String)
                _Red = value
            End Set
        End Property

        Public Property Blue() As Long
            Get
                Return _Blue
            End Get
            Set(ByVal value As Long)
                _Blue = value
            End Set
        End Property
    End Class

    Sub Main()
        Dim o As New ClassColor()
        o.Red = "The Color Red"
        o.Blue = 14
        o.Alpha = "The First"
        o.Beta = 202
        o.One = "One"
        o.Two = 2
        o.Three = 3.1415927

        Dim helper As New ReflectionHelper(o)

        Dim list1 = helper.ReflectProperties(helper.BaseClasses(0), o)
        Dim list2 = helper.ReflectProperties(helper.BaseClasses(1), o)
        Dim list3 = helper.ReflectProperties(helper.BaseClasses(2), o)
    End Sub

End Module

Public Class ReflectionHelper
    Private _SourceClass As Object
    Private _BaseClasses As New List(Of Type)

    Public Sub New()
    End Sub

    Public Sub New(source As Object)
        _SourceClass = source

        Dim t As Type = _SourceClass.GetType()
        While (t IsNot Nothing)
            _BaseClasses.Add(t)
            t = t.BaseType
        End While
    End Sub

    Public ReadOnly Property BaseClasses As List(Of Type)
        Get
            Return _BaseClasses
        End Get
    End Property

    Public Function ReflectProperties(ByVal baseClass As Type,
                                      ByVal instance As Object) As List(Of ReflectionHelperProperties)
        Dim result As New List(Of ReflectionHelperProperties)
        For Each prop In baseClass.GetProperties(Reflection.BindingFlags.DeclaredOnly Or
                                                 Reflection.BindingFlags.GetProperty Or
                                                 Reflection.BindingFlags.Instance Or
                                                 Reflection.BindingFlags.Public)
            result.Add(New ReflectionHelperProperties() With {.Name = prop.Name, .InstanceValue = prop.GetValue(instance, Nothing)})
        Next
        Return result
    End Function
End Class

Public Class ReflectionHelperProperties
    Public Name As String
    Public InstanceValue As Object
End Class

C# 中的相同代码

using System;
using System.Collections.Generic;

namespace ConsoleApplication23
{
    class Program
    {
        static void Main(string[] args)
        {
            // create the highest level type
            ClassColor o = new ClassColor();
            o.Red = "The Color Red";
            o.Blue = 14;
            o.Alpha = "The First";
            o.Beta = 202;
            o.One = "One";
            o.Two = 2;
            o.Three = 3.1415927;

            ReflectionHelper helper = new ReflectionHelper(o);

            List<ReflectionHelperProperties> list1 = helper.ReflectProperties(helper.BaseClasses[0], o);
            List<ReflectionHelperProperties> list2 = helper.ReflectProperties(helper.BaseClasses[1], o);
            List<ReflectionHelperProperties> list3 = helper.ReflectProperties(helper.BaseClasses[2], o);
        }
    }
}

public class ClassOne
{
    private string _One;
    private int _Two;

    private double _three;
    public string One {
        get { return _One; }
        set { _One = value; }
    }

    public int Two {
        get { return _Two; }
        set { _Two = value; }
    }

    public double Three {
        get { return _three; }
        set { _three = value; }
    }
}

public class ClassAlpha : ClassOne
{    
    private string _Alpha;    
    private long _Beta;

    public string Alpha {
        get { return _Alpha; }
        set { _Alpha = value; }
    }

    public long Beta {
        get { return _Beta; }
        set { _Beta = value; }
    }
}

public class ClassColor : ClassAlpha
{    
    private string _Red;    
    private long _Blue;

    public string Red {
        get { return _Red; }
        set { _Red = value; }
    }

    public long Blue {
        get { return _Blue; }
        set { _Blue = value; }
    }
}

public class ReflectionHelper
{
    private List<Type> _BaseClasses = new List<Type>();
    public ReflectionHelper()
    {
    }

    public ReflectionHelper(object source)
    {
        // build base types list
        Type t = source.GetType();
        while ((t != null)) {
            _BaseClasses.Add(t);
            t = t.BaseType;
        }
    }

    public List<Type> BaseClasses {
        get { return _BaseClasses; }
    }

    public List<ReflectionHelperProperties> ReflectProperties(Type baseClass, object instance)
    {
        List<ReflectionHelperProperties> result = new List<ReflectionHelperProperties>();
        foreach (System.Reflection.PropertyInfo p in baseClass.GetProperties(System.Reflection.BindingFlags.DeclaredOnly | 
                                                                             System.Reflection.BindingFlags.GetProperty | 
                                                                             System.Reflection.BindingFlags.Instance | 
                                                                             System.Reflection.BindingFlags.Public)) {
            result.Add(new ReflectionHelperProperties {
                Name = p.Name,
                InstanceValue = p.GetValue(instance, null)
            });
        }
        return result;
    }
}

public class ReflectionHelperProperties
{
    public string Name;
    public object InstanceValue;
}
于 2012-07-09T16:33:07.947 回答