私は、コンテキストにバインドされたオブジェクトから継承されるクラスを持っています。クラスにはいくつかのプロパティの属性があります。プロパティが変更されると、PostProcess(IMessage msg, IMessage msgReturn)
はイベントを発生させ、同じ属性を持つ新しいプロパティが再度発生します。 2回目の変更にはも必要ですが、それは起こっていません。おそらく、2番目のプロパティが変更されたオブジェクトは元の.netオブジェクトではなく、MarshalByRefObject/ContextBoundObject/Proxy Object
です。私の質問は、元のオブジェクトにプロキシをキャストする方法です。私はキャストしてSynchonizationAttribute
を試しましたが、それは役に立ちません。 Async
の方法でイベントが実行されているので、コードの実行をブロックせず、プロキシと元のオブジェクトが同じアプリドメインに存在することを通知するだけです。イベントチェーン/元のオブジェクトへのプロキシ
2つ目のオブジェクトを参照しようとしましたが、最初のプロパティを変更すると2番目のプロパティを変更しようとしましたが、を呼び出しませんでした。
基本的には、さまざまなオブジェクトが他のオブジェクトのプロパティに依存するツリーを作成する必要があります。いずれかのプロパティが変更されると、ウォッチャーがトリガーされ、ウォッチャーが見つからなくなるまでチェーンのように広がる可能性があります。 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);
});
}
}
Mainメソッド
PowerSwitch s1 = new PowerSwitch();
Bulb b1 = new Bulb();
b1.Watch(s1, "IsOn");
s1.IsOn = true; //<-- b1.update is called after this
私が達成したいものを実装するための代替またはより良い方法を提案してください。
問題の内容が100%明確ではありません。 –