假設我有這樣的操作:
public Action OnSomeAction;
我希望能夠從班級外部訂閱此操作,但無法呼叫它:
OnSomeAction.Invoke();
有沒有辦法做到這一點,而無需將操作設為私有并創建訂閱和取消訂閱的方法,如下所示:
private Action _someAction;
public void Subscribe(Action listener)
{
_someAction = listener;
}
public void Unsubscribe(Action listener)
{
_someAction -= listener;
}
private void Invoke()
{
_someAction.Invoke();
}
uj5u.com熱心網友回復:
您在尋找活動嗎?
public class MyClass {
// Let firing event be private
private void onMyAction() {
Action action = MyAction;
if (action != null)
action();
}
public void FireDemo() {
onMyAction();
}
//TODO: I've put Action, but, probably, EventHandler will be a better choice
// while event itself (subscribe / unsubscribe) being public
public event Action MyAction;
}
演示:
MyClass myClass = new MyClass();
var first = () => {Console.WriteLine("I'm the first")};
var second = () => {Console.WriteLine("I'm the second")};
var none = () => {Console.WriteLine("I should not fire")};
myClass.MyAction = first;
myClass.MyAction = second;
myClass.MyAction = none;
// Unsubsribe
myClass.MyAction -= none;
// Direct attempt will NOT compile:
// myClass.MyAction();
myClass.FireDemo();
uj5u.com熱心網友回復:
雖然這看起來很像事件。您也可以使用它來實作它Action。考慮以下與您建議的幾乎相同的代碼:
private List<Action> _someActionList = new List<Action>();
public void Subscribe(Action listener)
{
_someActionList.Add(listener);
}
public void Unsubscribe(Action listener)
{
_someActionList.Remove(listener);
}
private void Invoke()
{
foreach(action in _someActionList)
{
action();
}
}
我希望這正是你想要做的。如果不是,請進一步說明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392608.html
