4

現在、メソッドを呼び出していますが、それは機能します。これが私がしていることのサンプルです:

string result = (string)GetType().InvokeMember(actionName, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, this, new object[] { userId, roleId, rankId });

次のサンプルメソッドを呼び出します。

    private string UserName(int userId, int roleId, int rankId)
    {
        ...stuff...
        return "JoeDoe";
    }

ここに示すように、Reflectionを介して見つけた複数のメソッドがあります"UserName"が、それらはすべて同じシグネチャを持っています。タイプの開封を避けられますか?{int,int,int}この場合、たとえばnew object []の代わりに、パラメーターとして渡す方法はありますか?

ありがとうございました。

4

2 に答える 2

4

いいえ-リフレクションを使用して、メンバーを呼び出すために値をボックス化する必要があります。ただし、反射自体のコストは非常に高いため、この場合、ボクシング操作は(比較的)高価ではありません。

代わりに、デリゲートを作成できる場合は、デリゲートを直接呼び出すことができます。

Func<int, int, int, string> del = yourClassInstance.UserName;

// use three ints directly here...
string result = del(user, role, rank);

これにより、リフレクションやボクシングのオーバーヘッドなしに、さまざまなデリゲートをさまざまなメソッドに割り当てて呼び出すことができます。

于 2013-01-11T19:55:06.617 に答える
3

パフォーマンスオーバーヘッドを使用したReflectionは、ボクシング/アンボクシングのパフォーマンスオーバーヘッドよりも比類のないほど高いと思います。

ボクシング/開梱を持ち歩くべきではありません。

于 2013-01-11T19:56:55.257 に答える