C# 到原始对象的事件链/代理

C# 到原始对象的事件链/代理,c#,proxy,context-bound,C#,Proxy,Context Bound,我有一个从上下文绑定对象继承的类。类在某些属性上具有属性。当某些属性发生更改时,PostProcess(IMessage msg,IMessage msgReturn)引发一个事件,并从该事件中再次触发具有相同属性的新属性。第二个更改也应该调用后处理,但它没有发生。可能是因为,更改第二个属性的对象不是原始的.net对象,而是MarshalByRefObject/ContextBoundObject/Proxy对象。我的问题是如何将代理强制转换为原始对象。我尝试了强制转换和同步属性,但没有帮助。只

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

我尝试使用两个对象,其中一个包含second的引用,当第一个对象的属性更改时,它尝试更改second的属性,但它没有调用
后处理

基本上,我需要制作一棵树,其中各种对象取决于其他对象的属性。当任何一个属性被改变时,它应该触发它的观察者,这可能像一条链一样传播,直到找不到观察者为止。我正在使用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);

                            });
          }
    }
公共类电源开关:ObjectBase
{
[可观看]
公共对象{get;set;}
公共bool正在工作{get;set;}
}
公共类:对象库
{
公共颜色{get;set;}
[可观看]
公共对象{get;set;}
受保护的覆盖无效更新(对象发送方,PropertyChangeEventArgs e)
{
(灯泡)this.IsOn=!(灯泡)this.IsOn;
//sk.Value==propertyChangeEventArgs.Name)
托利斯先生()
.ForEach((项目)=>
{
item.Key.Update(此属性为propertyChangeEventArgs);
});
}
}
主要方法

        PowerSwitch s1 = new PowerSwitch();
        Bulb b1 = new Bulb();
        b1.Watch(s1, "IsOn");
        s1.IsOn = true; //<-- b1.update is called after this
PowerSwitch s1=新的PowerSwitch();
灯泡b1=新灯泡();
b1.手表(s1,“IsOn”);

s1.1=真// 看起来您非常接近,在那里,观察者订阅关于某个主题的状态通知

在该模式中,b1.IsOn=true将包含循环遍历观察者并通知其更改的代码。我想如果你想观察一个对象的很多属性,你可以封装通知代码。那么b1.IsOn可以有一行这样的内容:

this.SendNotification("IsOn", Value);
这看起来很像你正在做的。。。如果你仔细阅读了这个模式,你可能会觉得更有信心,也许你可以做一些改变来标准化你的代码


顺便说一句,在.Net中内置了一些东西来实现这个--。我没有使用这个,但它看起来很强大。

我不是100%清楚问题所在。灯泡和开关都是从ContextBoundObject继承的,它使用属性调用可监视对象的更新方法。它可以从Main方法中正常运行,但在update方法中,如果我修改任何其他对象,它不会调用messagesink的后处理方法,所以您希望能够使用[Watchable]装饰一个类,然后自动观察它的所有属性?我还真的不清楚。我需要一个上下文边界问题。:)