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]装饰一个类,然后自动观察它的所有属性?我还真的不清楚。我需要一个上下文边界问题。:)