В прошлом я использовал метод, который я нашел в Интернете для этого с помощью INotifyPropertyChanged
. Я не могу вспомнить, где именно, но это детали такое же разрешение:
http://paulstovell.com/blog/strong-property-names
C#
public class Test : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
RaisePropertyChanged(() => Name);
}
}
private void RaisePropertyChanged(Expression<Func<object>> property)
{
MemberExpression exp = property.Body as MemberExpression;
if (exp != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(exp.Member.Name));
}
}
}
VB
Public Class Test
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(value As String)
_Name = value
RaisePropertyChanged(Function() Me.Name)
End Set
End Property
Private Sub RaisePropertyChanged(Of T)(propertyName As Expression(Of Func(Of T)))
Dim exp As MemberExpression = TryCast(propertyName.Body, MemberExpression)
If exp IsNot Nothing Then
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(exp.Member.Name))
End If
End Sub
End Class
Главное преимущество делать это является рефакторинг. Если я когда-либо переименовал свое свойство, событие Lambda (и расширение NotifyPropertyChanged) автоматически изменится.
Update (2015)
Может быть, стоит отметить, что новые функции в Visual Studio 2015 сделать это еще проще. Ниже приведен код, приведенный выше, но с использованием новой функции nameof
(подробности об этом и других новых функциях можно найти Here).
C#
public class Test : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
RaisePropertyChanged(nameof(Name));
}
}
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
VB
Public Class Test
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(value As String)
_Name = value
RaisePropertyChanged(NameOf(Name))
End Set
End Property
Private Sub RaisePropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
Вы можете даже использовать nameof
на стороне абонента, для того, чтобы определить, является ли свойство является один вы заботитесь о:
private static void PropChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(Test.Name))
{
Console.WriteLine("The Property I care about changed");
}
}
Откуда вы знаете, что это свойство objAddress.AddressLine, которое вам нужно? Если это всегда одно и то же свойство, вы можете просто добавить константу в класс ex: ADDRESSLINE_PROPERTYNAME = "AddressLine" –
Это правда. Я надеялся обеспечить, чтобы этот журнал всегда оставался динамичным, если другие программисты в моей команде не нуждались в знаниях, чтобы изменить функцию ведения журнала, если они по каким-либо причинам меняют свойство (что было бы нарушением принципа Open/Closed, но другие программисты в моей команде не следуют правилам SOLID). – Lykeuhfox
, если вы не можете найти динамический способ, обязательно напишите комментарии к свойству: «Если вы измените имя, не забудьте изменить константу». –