Contract-Development
使用參數動態呼叫事件
如何動態呼叫帶有名稱的事件?例如,我的合約有一些事件,根據某些條件,我想呼叫其中一個。我不想使用 switch 或 if 語句,但想指定事件的名稱並用數據呼叫它
我嘗試了以下簡單範例,但沒有成功。
event StoredValue( string data); function callEvent(string eventName, data) { this.call(bytes4(sha3("StoredValue(data)"))); }
我想將名稱和參數傳遞給將用於呼叫事件的函式
事件不是函式,因此您必須將它們包裝在函式中以完成此操作,而是傳遞函式名稱,例如:
modifier onlySelf(){ require(msg.sender==this); _; } event EventOne(string data); event EventTwo(string data); function logEventOne(string data) public onlySelf{ EventOne(data); } function logEventTwo(string data) public onlySelf{ EventTwo(data); } function callEvent(string functionSignature, string data){ this.call(bytes4(sha3(functionSignature)),data); }
請注意,由於
this.call
將創建消息呼叫,因此您呼叫的函式必須是公開的才能工作。為了繞過它們是公開的這一事實,我添加了onlySelf
修飾符,因此只有合約可以呼叫它們。我建議不要這樣做,因為無論如何事件必須在編譯時存在,因此您可以直接執行 EventOne/EventTwo 而不是動態執行。