Редактировать: Основываясь на ответе LoveMeSomeCode, я считаю, что эта проблема появляется только в VB.Net.
Я пытаюсь вернуть класс в предыдущее состояние, сохраняя старые значения измененных свойств в словаре и устанавливая их с помощью отражения, когда мне нужно вернуться. У меня возникла проблема, когда, если старое значение 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. Сеттер может содержать нулевое значение (часто это свойство является строкой). Что я делаю не так или как мне обойти это?
Редактировать: Каждый метод завершается ошибкой, если я также передаю его как ноль напрямую.
Редактировать: Вот трассировки стека, если они кому-нибудь помогут:
Метод 1
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.
в Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod (метод TargetProcedure, аргументы Object [], логический [] CopyBack, флаги BindingFlags)
в Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet (Экземпляр объекта, Тип Тип, Строка MemberName, Объект [] Аргументы, Строка [] ArgumentNames, Тип [] Тип Аргументы, Логический OptimisticSet, Логический RValueBase, CallType CallType)
в Microsoft.VisualBasic.CompilerServices.Versioned.CallByName (Экземпляр объекта, String MethodName, CallType UseCallType, Object [] Аргументы)
в myProject .Presenter.CustomerDetailPresenter.RevertCustomer () в myfile : строка 378
Метод 2
System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова. ---> System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
в myProject .Presenter.CustomerDetailPresenter.set_City (строковое значение)
--- Конец внутренней трассировки стека исключений ---
в System.RuntimeMethodHandle._InvokeMethodFast (Объектная цель, аргументы Object [], SignatureStruct & sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast (Объектная цель, аргументы Object [], сигнатура сигнатуры, метод MethodAttributesAttributes, RuntimeTypeHandle typeOwner)
в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder Binder, параметры Object [], CultureInfo culture, логическое skipVisibilityChecks)
в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object [] параметры, CultureInfo culture)
в System.RuntimeType.InvokeMember (имя строки, BindingFlags bindingFlags, связыватель связывания, объектная цель, Object [] provideArgs, модификаторы ParameterModifier [], CultureInfo culture, String [] namedParams)
в System.Type.InvokeMember (имя строки, BindingFlags invokeAttr, связыватель Binder, цель объекта, аргументы объекта [])
в myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()
Метод 3
System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова. ---> System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
в myProject .Presenter.CustomerDetailPresenter.set_City (строковое значение)
--- Конец внутренней трассировки стека исключений ---
в System.RuntimeMethodHandle._InvokeMethodFast (Объектная цель, аргументы Object [], SignatureStruct & sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast (Объектная цель, аргументы Object [], сигнатура сигнатуры, метод MethodAttributesAttributes, RuntimeTypeHandle typeOwner)в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder Binder, параметры Object [], CultureInfo culture, логическое skipVisibilityChecks)
в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo)
в System.RuntimeType.InvokeMember (имя строки, BindingFlags bindingFlags, связыватель связывания, объектная цель, Object [] provideArgs, модификаторы ParameterModifier [], CultureInfo culture, String [] namedParams)
в System.Type.InvokeMember (имя строки, BindingFlags invokeAttr, связыватель Binder, цель объекта, аргументы объекта [])
в myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()