2

メソッド名とメソッド呼び出しの一連の引数をパラメーターとして取り、メソッドを実行し、メソッドの実行から取得した戻り値を返すメソッドを実装する可能性はありますか?

このメソッドは、任意の数と型のパラメーター、および任意の戻り型を持つメソッドを呼び出すために使用する必要があります。

これはリフレクションを使用して作成できることは知っていますが、リフレクションを使用するよりもパフォーマンスへの影響が小さい別のアプローチが存在するかどうかに興味があります。

後で編集: 異なるメソッドシグネチャを持つ多くの異なるメソッドを持つクラスがあるため、このようなメソッドを実装する必要がありますが、それらの大半は同じ形式です:

{    
  //code block 1
}
using (SomeObject obj = InitializeObject(){
   ...
   //some operations
   ...
}
{
   //code block 2
}

コードブロック 1コードブロック 2は同一で、使用ブロックの部分のみが異なります。コードの共通ブロックを含むメソッドを 1 つだけ使用し、メソッドごとに異なる部分に対して異なるメソッドを呼び出したいと考えています。リフレクションを使用してみましたが、目に見える方法でアプリケーションの速度が低下するため、使用しません。

4

4 に答える 4

1

申し訳ありませんが、メソッド名を文字列として取得する場合 -> .net リフレクションが最適です。

于 2012-04-30T12:10:27.227 に答える
1

詳細を調査する時間はありませんが、System.Reflection を Delegate.DynamicInvoke と組み合わせて使用​​すると、どこかがわかるかもしれません。

于 2012-04-30T12:11:29.677 に答える
1

.NET 4.0 で最新の DLR 機能を活用できます

impromptuinterfaceプロジェクトとそのレイト バインディング機能をご覧ください。

具体的InvokeMemberにはInvokeMemberAction方法。これらは、反射よりも 2 倍から 4 倍高速です。

于 2012-04-30T12:13:38.033 に答える
1

このようなものはうまくいくはずです...

public static string ExecMethodByName
    (string typeName, string methodName, string stringParam)
{
    Type t = Type.GetType(typeName);

    String s = (String)t.InvokeMember(
                    methodName,
                    BindingFlags.InvokeMethod | BindingFlags.Public | 
                        BindingFlags.Static,
                    null,
                    null,
                    new Object[] { stringParam });

    return s;
}
于 2012-04-30T12:19:38.403 に答える