事件链/代理到原始对象

本文关键字:原始 对象 代理 事件 | 更新日期: 2023-09-27 18:03:08

我有一个继承自上下文绑定对象的类。类在某些属性上有属性。当某些属性发生更改时,PostProcess(IMessage msg, IMessage msgReturn)引发一个事件,并从该事件中再次触发具有相同属性的新属性。第二个变化也应该叫PostProcess,但它没有发生。可能是因为,第二个属性改变的对象不是原来的。net对象,而是MarshalByRefObject / ContextBoundObject / Proxy Object。我的问题是如何将代理转换为原始对象。我试过铸造和SynchonizationAttribute,但没有帮助。只是让你知道事件以Async的方式执行,所以它不会阻塞代码执行,代理和原始对象都存在于同一个应用程序域。

我尝试了两个对象,一个持有第二个引用,当第一个的属性被改变时,它试图改变第二个的属性,但它没有调用PostProcess

基本上我需要做一个树,其中各种对象依赖于其他对象的属性。当任何一个属性被改变时,它应该触发它的监视程序,这可以像链一样传播,直到没有发现任何监视程序。我正在尝试使用ContextBoundObject。

示例:

public class PowerSwitch : ObjectBase
{
    [Watchable]
    public bool IsOn { get; set; }
    public bool IsWorking { get; set; }
}
public class Bulb : ObjectBase
{
    public Color Color { get; set; }
    [Watchable]
    public bool IsOn { get; set; }
    protected override void Update(object sender, PropertyChangeEventArgs e)
    {
        ((Bulb)this).IsOn = !((Bulb)this).IsOn; 
          //<-- b1.update should be called after this, but it is not
    }
}
[Watchable]
public class ObjectBase : ContextBoundObject
{
     public virtual void Watch(ObjectBase watch, string propertyName)
     {
         watch.Watcher.Add(this, propertyName);
     }
     protected virtual void Update(object sender, 
                            PropertyChangeEventArgs e) { }
     public Dictionary<ObjectBase, string> Watcher
                      = new Dictionary<ObjectBase, string>();
     internal void NotifyWatcher(
             PropertyChangeEventArgs propertyChangeEventArgs)
     {
          Watcher.Where(sk => sk.Value == propertyChangeEventArgs.Name)
                        .ToList()
                        .ForEach((item) =>
                        {
                            item.Key.Update(this, propertyChangeEventArgs);
                            });
          }
    }

主方法

        PowerSwitch s1 = new PowerSwitch();
        Bulb b1 = new Bulb();
        b1.Watch(s1, "IsOn");
        s1.IsOn = true; //<-- b1.update is called after this

请建议其他或更好的方法来实现我想要达到的目标。

事件链/代理到原始对象

看起来你非常接近观察者模式,观察者订阅一个主题的状态通知。

在这个模式中,b1。IsOn = true将包含循环遍历observer并通知它们更改的代码。我想,如果您想在一个对象上观察许多属性,您可以封装通知代码。然后b1。我可以只写一行,像这样:

this.SendNotification("IsOn", Value);

这看起来很像你在做什么…如果你仔细阅读了这个模式,你可能会觉得更有信心,也许你可以做一些改变来标准化你的代码。

顺便说一下,. net中为此内置了一些东西——IObservable(T)。我还没用过这个,但是它看起来很结实。