我制作了一个简单的类来保存用户设置。一切都运行良好,但我想简化/概括一点,但我无法从它的属性(FormLocation)获取对象(TestSavedSettings)。如下面的代码所示,我能够从它的位置属性中获取Form1对象...但是我无法使它在TestSavedSettings.FormLocation中工作相同。
以下代码已完成,可以剪切粘贴到新的VB Windows窗体应用程序中并运行,它会在每次启动时保留表单位置。
底线:我如何获得TestSettings.AddBinding' sn'的对象。争论? (就像我正在成功地进行' 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 :(得分:0)
执行所需操作的一种方法是编译并执行包含所需值的子表达式,而不是尝试手动处理它:
Dim settingExpression = DirectCast(sn.Body, MemberExpression).Expression
Dim setting = Expression.Lambda(Of Func(Of Object))(settingExpression).Compile().Invoke()