動的メソッド呼び出し.ネットコア


こんにちは!今日、我々は「ダイナミックなメソッド呼び出し」を実行するいくつかの方法を調査しようとしています.ネットコア.
あなたのうちの何人かはすでに知っています、少し前に、私はオープンソースプロジェクトOpenSleigh . それはサガ管理ライブラリです.NETコアアプリケーション.
私は最後の期間に多くのことに焦点を当てています、そして、これは残念なことに、私に私のブログとより勤勉であるように導きました.私は私のバックログのいくつかの記事を持っています.
とにかく、opensleighの最初のプロトタイプに取り組んでいる間(BTW、少なくともフォークかスター・アンペアを確認してください)the repository !), 何度もおもしろい問題に直面しなければならなかった.
私はそれを非常に迅速に要約しようとする

いくつかのインスタンスでメソッドを呼び出す必要がある場合は、メソッドのシグネチャであり、クラス型ではありません。


それはトリッキーな状況ですが、幸運にも私たちのために.ネットには目的地に到達する2、3の方法があります.
今の問題はどれですか?
だから私はそれを試してみて、いくつかのベンチマークを書くことを決めた.テストしました.
  • ダイレクトメソッド呼び出し
  • MethodInfo.Invoke
  • Delegate.DynamicInvoke
  • Func<> 押尾
  • dynamic  キャスト
  • もちろん、他の全てのテクニックのベースラインとして、例えば、○*ダイレクトメソッド呼出{**を使用します.
    ここでこの小さなクラスがあるとしましょう.
    public class Foo
    {
        public int Bar(int a, int b, bool c) => a + (c ? b : 0);
    }
    
    そして、私たちは、例に関して注意します.ええ、各テクニックを見てみましょう.

    MethodInfo.呼び出す
    ここでは単に単純に加留します.
    object fooInstance = ...; // we get this from somewhere else
    MethodInfo barMethod = ClassType.GetMethod(nameof(Foo.Bar));
    barMethod.Invoke(fooInstance, new[] { (object)1, (object)2, (object)false });
    

    デリゲート.ダイナマイト
    この場合、代わりに、私たちは少しのMethodInfo\**リファレンスを得ることによって出発します.
    object fooInstance = ...; // we get this from somewhere else
    MethodInfo barMethod = ClassType.GetMethod(nameof(Foo.Bar));
    var delegateType = Expression.GetDelegateType(typeof(Foo), typeof(int), typeof(int), typeof(bool), typeof(int));
    var @delegate = Delegate.CreateDelegate(delegateType, barMethod);
    @delegate.DynamicInvoke(new[] { fooInstance, (object)1, (object)2, (object)false });
    

    func <>呼び出し
    前のものと同様ですが、私たちは、{*} func <>への
    object fooInstance = ...; // we get this from somewhere else
    MethodInfo barMethod = ClassType.GetMethod(nameof(Foo.Bar));
    var delegateType = Expression.GetDelegateType(typeof(Foo), typeof(int), typeof(int), typeof(bool), typeof(int));
    var func = (Func<Foo, int, int, bool, int>)Delegate.CreateDelegate(delegateType, barMethod);
    func(fooInstance as Foo, 1, 2, false);
    
    この例は少し「shady」と思われます.なぜなら、実際には、そのインスタンスが型foo型であることを知っているからです.しかし、まだそれが役に立つかもしれないので、私はグループにそれを加えることに決めました.

    ダイナミックキャスト
    これは、コードを簡単にするためのコードです(もちろん、直接呼び出しの後に)、それは基本的にちょうど動的なくちばしとメソッド呼び出しへのキャストです.
    object fooInstance = ...; // we get this from somewhere else
    dynamic dynamicFoo = fooInstance as dynamic;
    dynamicFoo.Bar(1, 2, false);
    
    だから、この大騒ぎの後、誰が勝者ですか?私は、イメージが1000の語の価値があると思います:

    ご覧のように、直接メソッドを呼び出すと、確実に最速の方法です.直後に“SHADY”という言葉が続きます.
    いつものように、私はcode to GitHub , だから無料であなたの実験を実行し、私に知らせてください!