あなたが提供したサンプルコードでは、あなたはあなたが望むことをすることができません。A
内でプライベートにしたので、クラス外のコード(クラスを含む)からB
のインスタンスへのアクセスを封鎖しています。A
B
C
に含まれるイベントをサブスクライブおよびサブスクライブ解除するために、A
インスタンス内のメソッドがインスタンスにアクセスできるように、C
何らかの方法でインスタンスをパブリックにアクセス可能にする必要があります。B
A
編集: Baがパブリックであると仮定すると、プライベートであるため、最も簡単なC.MyListofBs
方法は、A内で必要なイベントをサブスクライブおよびサブスクライブ解除する独自のAdd/Removeメソッドを作成することです。
Action
私はまた、はるかにクリーンなクラスを支持して、あなたの代理人を削除する自由を取りました。
public class A
{
public Event Action<string> FooHandler;
//...some code that eventually raises FooHandler event
}
public class B
{
public A a = new A();
//...some code that calls functions on "a" that might cause
//FooHandler event to be raised
}
public class C
{
private List<B> MyListofBs = new List<B>();
//...code that causes instances of B to be added to the list
//and calls functions on those B instances that might get A.FooHandler raised
public void Add(B item)
{
MyListofBs.Add(item);
item.a.FooHandler += EventAction;
}
public void Remove(B item)
{
item.a.FooHandler -= EventAction;
MyListofBs.Remove(item);
}
private void EventAction(string s)
{
// This is invoked when "A.FooHandler" is raised for any
// item inside the MyListofBs collection.
}
}
編集:そして、でリレーイベントが必要な場合は、次C
のようにします。
public class C
{
private List<B> MyListofBs = new List<B>();
public event Action<string> RelayEvent;
//...code that causes instances of B to be added to the list
//and calls functions on those B instances that might get A.FooHandler raised
public void Add(B item)
{
MyListofBs.Add(item);
item.a.FooHandler += EventAction;
}
public void Remove(B item)
{
item.a.FooHandler -= EventAction;
MyListofBs.Remove(item);
}
private void EventAction(string s)
{
if(RelayEvent != null)
{
RelayEvent(s);
}
}
}