投稿者 るきお  (社会人) 投稿日時 2021/6/21 21:10:03
何か説明されていないこだわりを秘めているように感じますが、

ひとまず、7 は obj が List(Of T)自身かそれを継承したものであるかを判定すればよいのですよね?

次のプログラムでどうでしょうか?
Dim obj As Object = New SubListA(Of SubClassA)

Dim baseType = obj.GetType

While baseType.FullName <> "System.Object"
    Dim name As String = baseType.FullName

    If name.StartsWith("System.Collections.Generic.List`"Then
        MsgBox("7,objは、List(Of) と一致")
    End If

    baseType = baseType.BaseType
End While


8 は obj が List(Of T)自身かそれを継承したものであり、かつ、T が ClassA自身かそれを継承したものであるという判定すればよいのですよね?

Dim obj As Object = New SubListA(Of SubClassA)

Dim baseType = obj.GetType

While baseType.FullName <> "System.Object"
    Dim name As String = baseType.FullName

    If name.StartsWith("System.Collections.Generic.List`"Then
        Dim argType = baseType.GetGenericArguments(0)

        While argType.FullName <> "System.Object"
            Dim argTypeName = argType.FullName
            If argTypeName = "WindowsApp1.Form1+ClassA" Then
                MsgBox("8,objは、ジェネリック(Of ClassA) と一致")
            End If
            argType = argType.BaseType
        End While
        Exit While
    End If

    baseType = baseType.BaseType
End While


多分、私が紹介したプログラムでできることはわかっているけど、何かこだわっている制約があって、その制約を前提にどう実現するかということを気にされているのかなと感じました。

最近はこの手のプログラムはあまりはやっておらず、インターフェースや拡張メソッドを活用する方向性のように思います。
特にこのようなクラスの静的な定義を解析するプログラムは拡張メソッドに対応できませんから、本当に練習とか力試しの用途になるのではないかと思います。

何かの静的コード解析やメトリックで役に立つかどうか…。よろしければ、たこさんがこのようなプログラムに関心を持っている理由を教えてください。