1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C#の子オブジェクトから親メソッドを呼び出す -System.EventHandler-

Last updated at Posted at 2021-02-18

C#の子Classから親Classのメソッドを呼び出す方法
System.EventHandlerを使用する Unityには他のグラフィカルな方法がある模様だがコードの範囲内で収めたかったので今回はC#のSystem.EventHandlerを使用。
備忘録的に書き残すので間違えているところがあったらご了承

コード的にはChild.StartToCall を出発して Parent.CalledFunction までEventが飛べばいい

class Child{
    // イベントハンドラを定義 (今回はCustomArgsを送りたいため独自に定義)
    internal delegate void TestEventHandler(object sender TestEventArgs e);
    internal TestEventHandler testEventHandler;

    void StartToCall(){
        // 送信開始 ここから -> Parent.CalledFunctionが呼び出されれば成功
        var testEventArgs = new TestEventArgs();
        testEventArgs.valueToSend = value;
        testEventHandler(this, testEventArgs);
    }
}


// カスタムArgs valueを送る必要がない場合はもう少しかんたんに
class TestEventArgs: EventArgs{
    // 送りたいValueを定義 GameObjectでもいいしIntでも...
    internal Something valueToSend;
}


// 親のClass この中のCalledFunctionがChildのStartToCallから呼び出される
class Parent{
    Child child;

    Parent(){
        child = new Child();
        // Init ChildからHandlerを送る際の初期設定 ChildのHandlerにParentの呼び出されるFuncを登録しておく
        child.TestEventHandler += new Child.TestEventHandler(CalledFunction);
    }

    void CalledFunction(object o, TestEventArgs args){
        // このメソッドがChildから呼び出されたら成功
        print(args.valueToSend);
    }
}

くっそめんどくさいね。CustomArgsが必要ない場合はもう少し簡単になる模様
UnityをやるためにC#ならUnity謹製のEventがあってコードちょびっとでUIで弄れる。でも昔のXcodeのStoryboardでやらかした経験があるためあまりUI頼りにしたくないのだ。
以上


@ktz_alias@albireo様から訂正のコメントを頂いたのでモダンにしたバージョンも書いておく。

class Child{
    // イベントハンドラを定義 (今回はCustomArgsを送りたいため独自に定義)
    //*** 独自のHandlerは宣言しなくてもEventHandler<TEventArgs>が有るためこれを使用 ***
    internal event EventHandler<TestEventArgs> testEventHandler;

    void StartToCall(){
        // 送信開始 ここから -> Parent.CalledFunctionが呼び出されれば成功
        // *** モダンな書き方、VSによく注意されるやつだ... ***
        testEventHandler(this, new TestEventArgs(){
            valueToSend = value,
        });
    }
}


// カスタムArgs valueを送る必要がない場合はもう少しかんたんに
class TestEventArgs: EventArgs{
    // 送りたいValueを定義 GameObjectでもいいしIntでも...
    internal Something valueToSend;
}


// 親のClass この中のCalledFunctionがChildのStartToCallから呼び出される
class Parent{
    Child child;

    Parent(){
        child = new Child();
        // Init ChildからHandlerを送る際の初期設定 ChildのHandlerにParentの呼び出されるFuncを登録しておく
        // *** new Child.TestEventHandler(CalledFunction)今はこれ書かなくてもOK ***
        child.TestEventHandler += CalledFunction;
    }

    void CalledFunction(object o, TestEventArgs args){
        // このメソッドがChildから呼び出されたら成功
        print(args.valueToSend);
    }
}

ググって一番上に有るやつの記事を鵜呑みにしてはイケナイ
こういう筆者のせいで昔の古文書コードがネット上で脈々と受け継がれるわけだ。反省しています...

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?