Вот соответствующий код:
Точка входа в программу
Код: Выделить всё
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).< /p>
Затем я переключаю значение MyBool (на True) и печатаю его снова.
Однако в обработчике событий PropertyChanged значение MyBool печатается как False, что является старый value.
Такое поведение является неожиданным, поскольку BindableBase.SetProperty предназначен для запуска PropertyChanged после обновления значения. Я ожидал, что значение, напечатанное в обработчике PropertyChanged, всегда будет соответствовать обновленному значению, но это не так.
Моя гипотеза:
Я подозреваю, что VirtualMethodInterceptor Unity изменяет поведение SetProperty одним из следующих способов:
Изменение порядка операций: перехватчик может вставлять логику между назначением свойства и вызовом OnPropertyChanged, вызывая событие, которое будет вызвано перед обновлением значения.
Переопределение метода: перехватчик может оборачивать или переопределять метод SetProperty, что может помешать его ожидаемому поведению.
Что я пробовал:
- Отключение перехватчика: если я удалю вызов SetInterceptorFor\, проблема не происходят.
- Непосредственный вызов SetProperty: без перехвата, выходные данные согласованы и соответствуют моим ожиданиям.
- Запись вызовов метода: я попытался зарегистрировать метод порядок вызова, но не смог точно определить, где меняется поведение.
- Изменяет ли VirtualMethodInterceptor в Unity поведение таких методов, как SetProperty в BindableBase Prism?
- Если да, то как?
- Есть ли способ настроить перехватчик, чтобы он не мешал SetProperty?
- Существуют ли какие-либо рекомендуемые методы проверки того, как перехват Unity влияет на поведение метода?
Подробнее здесь: https://stackoverflow.com/questions/793 ... property-m