我不太确定如何问这个问题,但基本上我想知道如何一般地指定一个类类型,以便我可以键入和粘贴代码。
例如我有以下代码:
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,甚至是“this”,但没有任何效果。似乎必须有一种方法让编译器根据我将最后一个子更改为时收到的此错误消息来了解这一点:
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,但应该可以根据扩展方法中已知的其他信息轻松推断出该类型。
在过程定义中一般性地指定类类型可能是不可能的,在这种情况下,我每次使用它时都会修改代码,但我宁愿不这样做,并在过程中学习一些新的东西。