呼び出しメソッドのパラメータの値を取得するにはどうすればいいですか? 質問する

呼び出しメソッドのパラメータの値を取得するにはどうすればいいですか? 質問する

質問

私は、取得できる必要があるコードを書いています価値観クラスに呼び出されたメソッドからのパラメータ。ParameterInfo[]配列まで取得する方法はわかっていますが、その後値を取得する方法がわかりません。これは可能ですか?

もしそうなら、MethodInfo オブジェクトの MethodBody プロパティを使用することと関係があると思います。これにより、プロパティを含む IL ストリームを検査できますが、その方法がわからず、Google で該当するコードを見つけることができませんでした。

コード

// Finds calling method from class that called into this one
public class SomeClass
{
    public static void FindMethod()
    {
        for (int i = 1; i < frameCount; i++)
        {
            var frame = new StackFrame(i);
            var methodInfo = frame.GetMethod();
            if (methodInfo.DeclaringType != this.GetType())
            {
                string methodName = frame.GetMethod().Name;
                var paramInfos = methodInfo.GetParameters();

                // Now what?? How do I get the values from the paramInfos

                break;
            }
            else if (i == frameCount - 1)
            {
                throw new TransportException("Couldn't find method name");
            }
        }
    }
}

ベストアンサー1

スタックを自分でイントロスペクトせずにこれを行うことはできません (多くの最適化により、スタック フレームが期待どおりでなかったり、渡されたパラメーターが実際にはメソッド シグネチャが示唆するものと異なる場合があるため、これは脆弱です (最適化 JIT コンパイラが、オブジェクト/構造体のサブ フィールドのみを使用していることを検出し、代わりにそれを渡すことは完全に可能です)。

ParameterInfoは、サイン渡された値ではなく、コンパイルされたメソッドの値です。

これを自動的に実現する唯一の現実的な方法は、コード インジェクション (AOP など) を介してデータを作成し、IL の分析に基づいてそれを使用して必要な処理を実行することです。

これは一般的に良い考えではありません。何かをデバッグする必要がある場合はデバッガーを使用し、何かをログに記録する必要がある場合は、何をログに記録するかを明示的に指定してください。

わかりやすくシンプルな反射技法できない完全に一般性を持って望みを達成する

おすすめ記事