この質問をする方法はよくわかりませんが、基本的には、コードを入力して貼り付けることができるように、クラスタイプを一般的に指定する方法を知りたいと思います。
たとえば、次のコードがあります。
Public Class CustInfo
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Sub NotifyPropertyChanged(ByVal Name As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Name))
End Sub
Protected Sub NotifyPropertyChanged()
Dim myStackFrame As New StackFrame(1)
Dim myChangingPropertyName As String = myStackFrame.GetMethod.Name.Split("_")(1)
NotifyPropertyChanged(myChangingPropertyName)
End Sub
Protected Sub NotifyPropertyChanged(Of TResult)(propertyExpr As Expression(Of Func(Of CustInfo, TResult)))
NotifyPropertyChanged(Me.GetPropertySymbol(propertyExpr))
End Sub
アイデアは、最後のSub
ものを一般的なものにすることです。つまり、その定義でCustInfoを具体的に指定する必要はありません。このようにして、このコードを文字通り他のクラスにコピーすることができ、変更せずに動作します。
クラスの型を返すプロパティを作成して使用しようとしましたが、予想通り失敗しました。TypeOf、Me、さらには「これ」をロングショットで使用してみましたが、何も機能しませんでした。最後のサブを次のように変更したときに表示されるこのエラーメッセージに基づいて、コンパイラがこれを知る方法が必要なようです。
Protected Sub NotifyPropertyChanged(Of TResult)(propertyExpr As Expression(Of Func(Of TResult)))
NotifyPropertyChanged(Me.GetPropertySymbol(propertyExpr))
End Sub
Data type(s) of the type parameter(s) in extension method 'Public Function GetPropertySymbol(Of TResult)(expr As System.Linq.Expressions.Expression(Of System.Func(Of CustInfo, TResult))) As String' defined in 'CustClasses.Extensions' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
参照されている拡張メソッドは次のとおりです。
<Extension()>
Public Function GetPropertySymbol(Of T, TResult)(obj As T, expr As Expression(Of Func(Of T, TResult))) As String
Return DirectCast(expr.Body, MemberExpression).Member.Name
End Function
したがって、ご覧のとおり、コンパイラは何が起こっているかを正しく推測しましたが、それでも動作できませんでした。不明と思われる唯一のタイプはTResultですが、そのタイプは、既知の拡張メソッドの他の情報に基づいて簡単に推測できるはずです。
プロシージャ定義でクラスタイプを一般的に指定することは不可能かもしれません。その場合、コードを使用するたびにコードを変更しますが、その過程で何か新しいことを学びたくはありません。