编辑:根据 LoveMeSomeCode 的回答,我相信这个问题只出现在 VB.Net 中。
我试图通过将更改的属性的旧值保存在字典中并在需要恢复时通过反射设置它们来将类恢复到以前的状态。我遇到了一个问题,如果旧值是 Nothing (null),我在尝试设置属性时会得到一个空引用异常。这是我尝试过的。
假设每个循环都像这样:
For Each pair As KeyValuePair(Of String, Object) In myOldValues
...
Next
方法一:
CallByName(Me, pair.Key, CallType.Set, pair.Value)
方法二:
Me.GetType().InvokeMember(pair.Key, Reflection.BindingFlags.SetProperty, Nothing, Me, pair.Value)
方法三:
Dim propInfo As System.Reflection.PropertyInfo = Me.GetType.GetProperty(pair.Key)
propInfo.SetValue(Me, Convert.ChangeType(pair.Value, propInfo.PropertyType), Nothing)
对于这些方法中的每一个,当 pair.Value 为空时,我都会得到一个空引用异常。setter 能够保存一个空值(通常该属性是一个字符串)。我做错了什么或者我该如何解决?
编辑:如果我也直接将它传递给 null,则每种方法都会失败。
编辑:如果他们帮助任何人,这里是堆栈跟踪:
方法 1 System.NullReferenceException:对象引用未设置为对象的实例。在 Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags) 在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Object Instance, Type Type, String MemberName, Object [] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase, CallType CallType) at Microsoft.VisualBasic.CompilerServices.Versioned.CallByName(Object Instance, String MethodName, CallType UseCallType, Object[] Arguments) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer() 在我的文件中:第 378 行
方法 2 System.Reflection.TargetInvocationException:调用的目标已抛出异常。---> System.NullReferenceException:对象引用未设置为对象的实例。在我的项目.Presenter.CustomerDetailPresenter.set_City(String value) --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle .InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder,System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()
方法 3 System.Reflection.TargetInvocationException:调用的目标已抛出异常。---> System.NullReferenceException:对象引用未设置为对象的实例。在我的项目.Presenter.CustomerDetailPresenter.set_City(String value) --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle .InvokeMethodFast(对象目标,对象 [] 参数,签名 sig,MethodAttributes 方法属性,RuntimeTypeHandle typeOwner)在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化,布尔 skipVisibilityChecks)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams) 在 System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()