Вот соответствующий код:
Точка входа в программу
Код: Выделить всё
internal class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension();
container.RegisterType();
container.Configure()
.SetInterceptorFor(new VirtualMethodInterceptor());
var bll = container.Resolve();
bll.PropertyChanged += Bll_PropertyChanged;
bll.GetMenus();
Console.ReadLine();
}
private static void Bll_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(MenuBll.MyBool))
{
MenuBll bll = (MenuBll)sender;
Console.WriteLine("MyBool in PropertyChanged: " + bll.MyBool);
}
}
}
Код: Выделить всё
public class MenuBll : BindableBase, INotifyPropertyChanged
{
[LogHandlerAttribute]
public virtual void GetMenus()
{
Console.WriteLine($"MyBool in method: {MyBool}");
MyBool = !MyBool;
Console.WriteLine($"MyBool now: {MyBool}");
}
private bool myBool = false;
public bool MyBool
{
get => myBool;
set
{
SetProperty(ref myBool, value);
}
}
}
Код: Выделить всё
MyBool in method: False
MyBool in PropertyChanged: False
MyBool now: True
Внутри метода GetMenus я сначала печатаю текущее значение MyBool (которое равно False).Затем я переключаю значение MyBool (на True) и печатаю его снова.
Однако в обработчике событий PropertyChanged значение MyBool печатается как False, что является старым значением.
Такое поведение является неожиданным, поскольку BindableBase.SetProperty предназначен для запуска PropertyChanged после обновления значения. Я ожидал, что значение, напечатанное в обработчике PropertyChanged, всегда будет соответствовать обновленному значению, но это не так.
Моя гипотеза:
Я подозреваю, что VirtualMethodInterceptor Unity изменяет поведение SetProperty одним из следующих способов:
Изменение порядка операций: перехватчик может вставлять логику между назначением свойства и вызовом OnPropertyChanged, вызывая событие, которое должно быть вызвано до обновления значения.
Переопределение метода: перехватчик может оборачивать или переопределять метод SetProperty, что может помешать его ожидаемому поведению.
Что я делаю? Пробовал:
Отключение перехватчика: если я удалю вызов SetInterceptorFor, проблема не возникнет.
Непосредственный вызов SetProperty: без перехвата выходные данные соответствует моим ожиданиям.
Запись вызовов методов: я пытался записать порядок вызова методов, но не смог точно определить, где меняется поведение.
Мои вопросы:
1.Изменяет ли VirtualMethodInterceptor Unity поведение таких методов, как SetProperty в BindableBase Prism?
2.Если да, то как?
3.Есть ли способ настроить перехватчик, чтобы избежать вмешательства в SetProperty?
4.Существуют ли какие-либо рекомендуемые методы проверки того, как перехват Unity влияет на поведение метода?
Подробнее здесь: https://stackoverflow.com/questions/793 ... roperty-me
Мобильная версия