2014-04-09 1 views
0

사용자 설정을 저장하기 위해 간단한 클래스를 만들었습니다. 모두 잘 작동하지만 좀 더 단순화/일반화하고 싶습니다만, Object (TestSavedSettings)를 Property (FormLocation)에서 가져 오는 데 문제가 있습니다. 아래 코드에서 볼 수 있듯이 Form1 객체를 Location 속성에서 가져올 수는 있지만 TestSavedSettings.FormLocation에 대해 동일한 작업을 수행 할 수는 없습니다.Object.Property에서 개체 확인 (영구 설정에 사용)

아래 코드는 완료되었으며 새로운 VB Windows Forms 응용 프로그램에 붙여 넣기하여 실행할 수 있습니다. 그러면 시작 시마다 양식 위치가 유지됩니다.

결론 : TestSettings.AddBinding 'sn'인수에 해당하는 Object를 어떻게 구할 수 있습니까? (필자는 'PN'인수에 대해 성공적으로 일을 오전대로?


Imports System.Linq.Expressions Imports System.Configuration Imports System.Reflection Public Class Form1 Private TestSavedSettings As New TestSettings_TestForm Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load TestSavedSettings.AddBinding(Function() Me.Location, Function() TestSavedSettings.FormLocation) 'Below is what I would like to use instead of the version in the line above ' TestSettings.AddBinding(Function() Me.Location, Function() TestSavedSettings.FormLocation) End Sub Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing TestSavedSettings.Save() End Sub End Class Public Class TestSettings_TestForm : Inherits ApplicationSettingsBase <UserScopedSettingAttribute()> Public Property FormLocation() As Point Get Return CType(Me(MethodBase.GetCurrentMethod().Name.Remove(0, 4)), Point) End Get Set(ByVal value As Point) Me(MethodBase.GetCurrentMethod().Name.Remove(0, 4)) = value End Set End Property '--This alternative method works, but I'd like to just have one shared version of this in a seperate Class as shown at end Public Sub AddBinding(Of T, T2)(ByVal pn As Expression(Of Func(Of T)), ByVal sn As Expression(Of Func(Of T2))) Dim FrmPropertyName As String = DirectCast(pn.Body, MemberExpression).Member.Name Dim Frm As Form = DirectCast(DirectCast(DirectCast(pn.Body, MemberExpression).Expression, ConstantExpression).Value, Form) Dim SettingName As String = DirectCast(sn.Body, MemberExpression).Member.Name Frm.DataBindings.Add(New Binding(FrmPropertyName, Me, SettingName, True, DataSourceUpdateMode.OnPropertyChanged)) End Sub End Class Public Class TestSettings Public Shared Sub AddBinding(Of T, T2)(ByVal pn As Expression(Of Func(Of T)), ByVal sn As Expression(Of Func(Of T2))) Dim FrmPropertyName As String = DirectCast(pn.Body, MemberExpression).Member.Name Dim Frm As Form = DirectCast(DirectCast(DirectCast(pn.Body, MemberExpression).Expression, ConstantExpression).Value, Form) Dim SettingName As String = DirectCast(sn.Body, MemberExpression).Member.Name '>>>>>Problem is with line below, causes exception, .Expression is actrually returning a FieldExpression not a ConstantExpression, 'but can't cast to that.... Dim Setting As Object = DirectCast(DirectCast(sn.Body, MemberExpression).Expression, ConstantExpression).Value Frm.DataBindings.Add(New Binding(FrmPropertyName, Setting, SettingName, True, DataSourceUpdateMode.OnPropertyChanged)) End Sub :End Class

답변

0

한 가지 방법은 컴파일하고이 들어있는 하위 식을 실행하는 것입니다 당신이 원하는 할 필요한 값을 수동으로 처리하는 대신

Dim settingExpression = DirectCast(sn.Body, MemberExpression).Expression 
Dim setting = Expression.Lambda(Of Func(Of Object))(settingExpression).Compile().Invoke() 
+0

감사합니다. 완벽하게 작동했습니다. – curtis1757