【问题标题】:How to get base properties and fields with values using reflection to work up the class hierarchy?如何使用反射来获取具有值的基本属性和字段以建立类层次结构?
【发布时间】:2012-07-02 10:56:38
【问题描述】:

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

【问题讨论】:

    标签: .net reflection base-class locals


    【解决方案1】:

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

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

    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;
    }
    

    【讨论】:

    • 感谢您的示例,我发现我只需要使用 BaseType。
    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多