0

リフレクションを使用して基本クラスのプロパティとフィールドを取得する方法 目標は、デバッガーの [ローカル] ウィンドウのように、任意のクラス インスタンスの値を持つプロパティとフィールドを表示するツリー表示を作成することです。「ベース」ツリー ノードが展開されたときに、値を持つプロパティとフィールドをオンデマンドで表示できるように、各ベース インスタンスを遅延ロードする機能が必要です。

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 に答える