ログの目的でプロパティの名前を取得する必要があるという問題に遭遇しました。リフレクションとラムダ式の融合を使用して VB.Net でこれを行う方法があると確信していますが、これまでのところ成功していません。
私がやろうとしているのは、これを変換することです:
objAddress.AddressLine
これに:
"AddressLine"
ログの目的でプロパティの名前を取得する必要があるという問題に遭遇しました。リフレクションとラムダ式の融合を使用して VB.Net でこれを行う方法があると確信していますが、これまでのところ成功していません。
私がやろうとしているのは、これを変換することです:
objAddress.AddressLine
これに:
"AddressLine"
過去に、オンラインで見つけた方法を使用して、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 イベント) が自動的に変更されます。
アップデート (2015)
Visual Studio 2015 の新機能により、これがさらに簡単になることに言及する価値があるかもしれません。以下は、上記と同じコードですが、新しいnameof
機能を使用しています (これと他の新機能の詳細については、こちらを参照してください)。
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");
}
}
MSDNから
Imports System
Imports System.Reflection
Class MyClass1
Private myProperty1 As Integer
' Declare MyProperty.
Public Property MyProperty() As Integer
Get
Return myProperty1
End Get
Set(ByVal Value As Integer)
myProperty1 = Value
End Set
End Property
End Class 'MyClass1
Public Class MyTypeClass
Public Shared Sub Main(ByVal args() As String)
Try
' Get Type Object corresponding to MyClass.
Dim myType As Type = GetType(MyClass1)
' Get PropertyInfo object by passing property name.
Dim myPropInfo As PropertyInfo = myType.GetProperty("MyProperty")
' Display Name propety to console.
Console.WriteLine("The {0} property exists in MyClass.", myPropInfo.Name)
Catch e As NullReferenceException
Console.WriteLine("The property does not exist in MyClass.", e.Message.ToString())
End Try
End Sub 'Main
End Class 'MyTypeClass
定数を使用するという最初の質問に対する the_lotus の回答に従うことにしました。近い将来、これを行うためのより動的な方法を見つけたら、投稿しようと思います。ロータス、これがあなたのコメントで質問に答えているのを見たら、私は答えられたステータスをあなたに切り替えます.