投稿者 るきお  (社会人) 投稿日時 2023/1/23 19:52:36
> NameOf演算子のように(ClassA.Alpha)だけにしたいのですが、メソッドの引数をどうすれば受け取れるようにできるのでしょうか?

簡単に言うとできないと思います。
(もし、だれかよいアイディアがあれば教えてください。)

SSD さんのご質問のポイントは、このプログラムでは、2回「ClassA」と記述する必要があるので、スマートではなく、ClassA の記述を1回で済ます方法は何かないかということだと受け取りました。
Dim name = GetDisplayName(Of ClassA)(NameOf(ClassA.Alpha))


NameOf演算子は、実行時ではなくコンパイル時に解釈され、指定したものの名前を表す単なる文字列に置き換えられます。その点でNameOfは特殊で、そのオペランド(≒引数)はVBの通常の構文から隔絶された特別扱いをされているのだと思います。上記のプログラムは実行時のVBには次のように見えています。
Dim name = GetDisplayName(Of ClassA)("Alpha")

このプログラムでは「ClassA」は1回しか登場していないのですよね。
とは言え、自分のプログラムで"Alpha"を文字列で書いてしまうと、メンテナンス性が悪くなってしまうので気が引けます。良い解決策はないように思います。


もし、単一のプロパティではなく、複数のプロパティを調べるのであれば、次のように書けるので特に冗長なプログラムにはなりません。
For Each prop In GetType(ClassA).GetProperties()
    '属性取得  
    Dim att = prop.GetCustomAttribute(GetType(DisplayNameAttribute))
    If att Is Nothing Then
        Continue For
    End If
    'キャストして属性値取得  
    Dim name = CType(att, DisplayNameAttribute).DisplayName
    Debug.WriteLine($"{prop.Name}: {name}")
Next