投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/24 11:32:13
> 例えばClassAのAlphaプロパティーのDisplayName属性値を取得する場合はこんな感じで呼び出すことになります。
getter / setter 側の DisplayName は、今回考慮しないのですね?

<DisplayName("クラス")>
Public Class ClassA
    <DisplayName("アルファ")>
    Public Shared ReadOnly Property Alpha As Byte

    Public Shared Property Beta As Byte
        <DisplayName("Get Beta")>
        Get
            Return 0
        End Get
        <DisplayName("Set Beta")>
        Set
            _Beta = Value
        End Set
    End Property
    Private Shared _Beta As Byte
End Class



> 'プロパティー情報取得 
> Dim propInfo = GetType(T).GetProperty(propName)
> '属性取得 
> Dim att = Attribute.GetCustomAttribute(propInfo, GetType(DisplayNameAttribute))

propName が NameOf(プロパティ名) である保証はありませんので、
Nothing 判定を追加した方が良さそうです。
DisplayName はメソッド名やイベント名につけられることもあるからです。
そもそも、NameOf されなければスペルミスされる可能性もあるわけで。

さらに言えば、たとえ T 型の プロパティに限定するという前提であったとしても、
GetProperty ではなく、GetProperties に切り替えた方が良いかもしれません。
そうしないと、オーバーロードを持つプロパティを渡したときにエラーになります。

<DisplayName("アイテム[number]")>
Public Property Items(n As IntegerAs String
    <DisplayName("Getアイテム[number]")>
    Get
        Return $"Items[{n}]"
    End Get
    <DisplayName("Setアイテム[number]")>
    Set
    End Set
End Property

<DisplayName("アイテム[string]")>
Public ReadOnly Property Items(s As StringAs String
    <DisplayName("Get アイテム[string]")>
    Get
        Return "Items." & s
    End Get
End Property



> メソッドの引数をどうすれば受け取れるようにできるのでしょうか?
呼び方が変わってしまいますが、単行ラムダ式で指定しても構わなければ、
『式木』から辿るというのは如何でしょう。