編輯:基於LoveMeSomeCode的答案,我相信這個問題只出現在VB.Net中。使用反射設置屬性值爲Nothing(空)
我想通過在字典中保存已更改屬性的舊值並在需要恢復時通過反射設置它們來將類恢復爲以前的狀態。我有一個問題,如果舊值是Nothing(null)當我嘗試設置屬性時,我得到一個空引用異常。這是我嘗試過的。
假設每個循環是這樣的:
For Each pair As KeyValuePair(Of String, Object) In myOldValues
...
Next
方法1:
CallByName(Me, pair.Key, CallType.Set, pair.Value)
方法2:
Me.GetType().InvokeMember(pair.Key, Reflection.BindingFlags.SetProperty, Nothing, Me, pair.Value)
方法3:
Dim propInfo As System.Reflection.PropertyInfo = Me.GetType.GetProperty(pair.Key)
propInfo.SetValue(Me, Convert.ChangeType(pair.Value, propInfo.PropertyType), Nothing)
對於這些方法中的每一個,當pair.Value爲null時,我會得到一個空引用異常。 setter能夠保存一個空值(通常該屬性是一個字符串)。我做錯了什麼,或者我該如何解決它?
編輯:如果我直接傳遞null,每個方法都會失敗。
編輯:這裏是堆棧跟蹤,如果他們幫助別人:
方法1 System.NullReferenceException:對象不設置到對象的實例。 at Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure,Object [] Arguments,Boolean [] CopyBack,BindingFlags Flags) at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Object Instance,Type Type,String MemberName ,Object []參數,String [] ArgumentNames,Type [] TypeArguments,布爾OptimisticSet,布爾RValueBase,CallType CallType)在Microsoft.VisualBasic.CompilerServices.Versioned.CallByName(對象實例,字符串MethodName,CallType UseCallType,Object []參數 參數) 在MYFILEmyProject的 .Presenter.CustomerDetailPresenter.RevertCustomer():線378
方法2 System.Reflection.TargetInvocationException:調用的目標引發了異常。 ---> System.NullReferenceException:未將對象引用設置爲對象的實例。 在myProject的 .Presenter.CustomerDetailPresenter.set_City(字符串值) ---內部異常堆棧跟蹤的結尾--- 在System.RuntimeMethodHandle._InvokeMethodFast(對象目標,對象[]參數,SignatureStruct & SIG,MethodAttributes methodAttributes ,運行時類型句柄typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object object,Object [] arguments,Signature sig,MethodAttributes methodAttributes,RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [ ]參數,CultureInfo文化,布爾skipVisibilityChecks) 在System.Reflection.RuntimeMethodInfo。Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []參數,CultureInfo culture) at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier []修飾符,CultureInfo培養,字符串[] namedParams) 在System.Type.InvokeMember(字符串名稱,的BindingFlags invokeAttr,粘結劑粘結劑,對象目標,在myProject的 .Presenter.CustomerDetailPresenter.RevertCustomer()
對象[]參數) 方法3 System.Reflection.TargetInvocationException:調用的目標引發了異常。 ---> System.NullReferenceException:未將對象引用設置爲對象的實例。 在myProject的 .Presenter.CustomerDetailPresenter.set_City(字符串值) ---內部異常堆棧跟蹤的結尾--- 在System.RuntimeMethodHandle._InvokeMethodFast(對象目標,對象[]參數,SignatureStruct & SIG,MethodAttributes methodAttributes ,運行時類型句柄typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object object,Object [] arguments,Signature sig,MethodAttributes methodAttributes,RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [ ]參數,CultureInfo culture,布爾skipVisibilityChecks)
at System.Ref lection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []參數,CultureInfo culture) at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [ ]改性劑,CultureInfo的文化,字符串[] namedParams) 在System.Type.InvokeMember(字符串名稱,的BindingFlags invokeAttr,粘結劑粘結劑,目標對象,對象[]參數) 在myProject的 .Presenter.CustomerDetailPresenter.RevertCustomer()
你確定PropertyInfo.SetValue是拋出異常的方法嗎? – jason 2009-01-23 00:14:00
這或它的一個子方法,就是這一行。 – 2009-01-23 01:22:27
檢查異常堆棧跟蹤;你應該能夠辨別出拋出異常的方法。如果你無法弄清楚,請嘗試單獨調用Convert.ChangeType。我懷疑是該方法拋出異常。 – jason 2009-01-23 01:31:59