将OnPropertyChanged从C#移植到VB.Net

时间:2015-01-03 03:44:41

标签: c# vb.net linq converter

我找到了一些非常有趣的代码来连接IPropertyChanged,要查看文章,请点击here

我的问题是在我将其转换为VB.Net后,我在最后一行的OnPropertyChanged方法中收到编译器错误 - OnPropertyChanged(body.Member.Name)

  

方法'Protected Overridable Sub OnPropertyChanged(Of T)中的类型参数的数据类型(selectorExpression As System.Linq.Expressions.Expression(Of System.Func(Of T)))'不能是从这些论点中推断出来。明确指定数据类型可能会纠正此错误。

有人可以帮我纠正代码以删除错误吗?

原创C#版本:

protected virtual void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression)
{
    if (selectorExpression == null)
        throw new ArgumentNullException("selectorExpression");
    MemberExpression body = selectorExpression.Body as MemberExpression;
    if (body == null)
        throw new ArgumentException("The body must be a member expression");
    OnPropertyChanged(body.Member.Name);
}

protected bool SetField<T>(ref T field, T value, Expression<Func<T>> selectorExpression)
{
    if (EqualityComparer<T>.Default.Equals(field, value)) return false;
    field = value;
    OnPropertyChanged(selectorExpression);
    return true;
}

转换为VB.Net后

Protected Overridable Sub OnPropertyChanged(Of T)(selectorExpression As Expression(Of Func(Of T)))
    If selectorExpression Is Nothing Then
        Throw New ArgumentNullException("selectorExpression")
    End If
    Dim body As MemberExpression = TryCast(selectorExpression.Body, MemberExpression)
    If body Is Nothing Then
        Throw New ArgumentException("The body must be a member expression")
    End If
    OnPropertyChanged(body.Member.Name)//====this is the line with the compiler error======
End Sub

Protected Function SetField(Of T)(ByRef field As T, value As T, selectorExpression As     Expression(Of Func(Of T))) As Boolean
    If EqualityComparer(Of T).[Default].Equals(field, value) Then
        Return False
    End If
    field = value
    OnPropertyChanged(selectorExpression) 
    Return True
End Function

2 个答案:

答案 0 :(得分:3)

在VB中它比那简单得多......只需在你的班级顶部贴一个Implements INotifyPropertyChanged

OnPropertyChanged子只是提升事件的捷径。

Imports System.ComponentModel

Public Class SomeClass
    Implements INotifyPropertyChanged

    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _
        Implements INotifyPropertyChanged.PropertyChanged

    Protected Sub OnPropertyChanged(ByVal propName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
    End Sub

    Private _someProperty As String = ""
    Public Property SomeProperty As String
        Get
            Return _someProperty
        End Get
        Set(value As String)
            _someProperty = value
            OnPropertyChanged("SomeProperty")
        End Set
    End Property
End Class

或者如果你想要一些没有魔法字符串的东西你可以复制并粘贴到任何地方,只要你不介意使用反射:

OnPropertyChanged(System.Reflection.MethodInfo.GetCurrentMethod.Name.Replace("set_", ""))

或者,如果您使用的是.NET 4.5+,请将OnPropertyChanged声明更改为:

Private Sub OnPropertyChanged(<CallerMemberName> Optional ByVal propName As String = Nothing)

并且不加参数地调用它。

答案 1 :(得分:0)

我发现我需要在文章中添加以下代码:

Public Event PropertyChangedHandler As PropertyChangedEventHandler 

Protected Sub OnPropertyChanged(propertyName As String)
    RaiseEvent PropertyChangedHandler(Me, New PropertyChangedEventArgs(propertyName))
End Sub