【发布时间】:2025-12-13 01:50:02
【问题描述】:
我不太确定如何问这个问题,但基本上我想知道如何指定一个类类型,以便我可以键入和粘贴代码。
例如我有以下代码:
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,但应该可以根据扩展方法中已知的其他信息轻松推断出该类型。
在过程定义中一般性地指定类类型可能是不可能的,在这种情况下,我会在每次使用它时修改代码,但我宁愿不这样做,并在过程中学习一些新的东西。
【问题讨论】:
-
请注意,正如您当前声明的那样,
propertyExpr需要为As Expression(Of Func(Of <type of Me>, TResult))以匹配expr。 (我现在已经充分审查了您的问题,以一般的方式知道这是您要解决的问题。)
标签: vb.net linq linq-expressions