среда, июня 23, 2004
вторник, июня 22, 2004
На заметку - наблюдение за классом
Можно ли как-то со стороны одного экземпляра следить за состоянием другого экземпляра? Например, есть класс A у которого есть свойство P1 и класс B, который должен как-то узнавать обо всех изменениях A.P1. При этом, чтобы сам класс A ничего не подозревал о том, что за ним «наблюдают»?
public class A
{
public string P1
{
get {return this._P1;}
set
{
this._P1 = value;
}
}
private string _P1 = string.Empty;
}
> ... чтобы сам класс A ничего не подозревал о том, что за ним «наблюдают» ...
Если я правильно понимаю, это значит, что в самом классе A ничего не меняется
> ... класс B, который должен как-то узнавать обо всех изменениях A.P1
Это можно сделать:
A a = new A();
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].AddValueChanged(this.a, new EventHandler(A_ValueChanged));
private void A_ValueChanged(object sender, EventArgs e)
{
MessageBox.Show("sss");
}
Теперь вызываем изменение свойства
a.P1 = "str"; // это не приведет к вызову обработчика.
Для того, чтобы все заработало, свойство A.P1
следует менять след. образом:
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].SetValue(this.a, "D6");
Кстати, PropertyGrid скорее всего таким способом меняет
значения свойств у объектов:
PropertyGrid p = new PropertyGrid();
p.Parent = this;
p.Dock = DockStyle.Fill;
p.SelectedObject = this.a;
Изменение свойства this.a.P1 из PropertyGrid также
приводит к вызову A_ValueChanged
public class A
{
public string P1
{
get {return this._P1;}
set
{
this._P1 = value;
}
}
private string _P1 = string.Empty;
}
> ... чтобы сам класс A ничего не подозревал о том, что за ним «наблюдают» ...
Если я правильно понимаю, это значит, что в самом классе A ничего не меняется
> ... класс B, который должен как-то узнавать обо всех изменениях A.P1
Это можно сделать:
A a = new A();
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].AddValueChanged(this.a, new EventHandler(A_ValueChanged));
private void A_ValueChanged(object sender, EventArgs e)
{
MessageBox.Show("sss");
}
Теперь вызываем изменение свойства
a.P1 = "str"; // это не приведет к вызову обработчика.
Для того, чтобы все заработало, свойство A.P1
следует менять след. образом:
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].SetValue(this.a, "D6");
Кстати, PropertyGrid скорее всего таким способом меняет
значения свойств у объектов:
PropertyGrid p = new PropertyGrid();
p.Parent = this;
p.Dock = DockStyle.Fill;
p.SelectedObject = this.a;
Изменение свойства this.a.P1 из PropertyGrid также
приводит к вызову A_ValueChanged
Log4Net
Повозился с субжевой системой. Ничего так, когда разберёшься. Пристроил свой Appender для вывода протокола в TextBox. Точнее, годится для любого класса, имеющего метод, принимающий строку в качестве параметра.
четверг, июня 17, 2004
2 Гб
Схватил два аккаунта по гигу размером - на SpyMac.net и на Gmail. Зачем - ХЕЗ. Запас карман не тянет, приспособим для чего-нить.
Ура!
Ура!
Подписаться на:
Сообщения (Atom)