La semplice classe che vi propongo permette di ricavare, sfruttando lo stacktrace, il nome della proprietà in cui ci si trova dinamicamente.
La classe è una classe utility che presenta un metodo statico il cui risultato è il nome della property in cui ci si trova (sia che siamo nel Get che nel Set) oppure Nothing se non siamo in una property:
- Public NotInheritable Class PropertyHelper
- Private Sub New()
- End Sub
- Private Const SetPropertyPrefix = "set_"
- Private Const GetPropertyPrefix = "get_"
- Public Shared Function GetCurrentPropertyName() As String
- Dim retval As String = Nothing
- Dim method = (From sf In New StackTrace().GetFrames
- Where sf.GetMethod().DeclaringType <> GetType(PropertyHelper)
- Select sf.GetMethod()).FirstOrDefault()
- If method IsNot Nothing Then
- If method.Name.StartsWith(SetPropertyPrefix) Then
- retval = method.Name.Replace(SetPropertyPrefix, "")
- End If
- If method.Name.StartsWith(GetPropertyPrefix) Then
- retval = method.Name.Replace(GetPropertyPrefix, "")
- End If
- End If
- Return retval
- End Function
- End Class
La classe può essere utilizzata, ad esempio, nelle proprietà di quelle classi che implementano l’interfaccia INotifyPropertyChanged per non “cablare” la stringa con il nome delle proprietà all’interno del codice:
- Imports System.ComponentModel
- Public Class Utente
- Implements INotifyPropertyChanged
- Private _Nome As String
- Public Property Nome() As String
- Get
- Return _Nome
- End Get
- Set(ByVal value As String)
- If value <> _Nome Then
- _Nome = value
- OnPropertyChanged(PropertyHelper.GetCurrentPropertyName())
- End If
- End Set
- End Property
- Protected Sub OnPropertyChanged(ByVal propertyName As String)
- RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
- End Sub
- Public Event PropertyChanged(ByVal sender As Object,
- ByVal e As System.ComponentModel.PropertyChangedEventArgs) _
- Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
- End Class
Technorati Tag: StackTrace,Reflection,diagnostic,property,inotifypropertychanged,inotifypropertychanging
Commenti